authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-21 19:40:44-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-21 19:40:44-05:00
log92559cd02cbf6497b99eb5193c9094e6d92c214e
tree13ff36b93f06555fd31803750debbd03d10f4b47
parent15d5cab569a5ffc6495d606f460264429043aabf
signature Commit is signed but in an unrecognized format.

hit a comptime limitation with computing dense sets


21 files changed, 1728 insertions(+), 3115 deletions(-)

lib/std/build.zig+1-1
......@@ -1983,7 +1983,7 @@ pub const LibExeObjStep = struct {
19831983
19841984 var feature_str_buffer = try std.Buffer.initSize(builder.allocator, 0);
19851985 for (self.target.getArch().allFeaturesList()) |feature, i| {
1986 if (features.isEnabled(@intCast(u8, i))) {
1986 if (features.isEnabled(@intCast(Target.Cpu.Feature.Set.Index, i))) {
19871987 try feature_str_buffer.append(feature.name);
19881988 try feature_str_buffer.append(",");
19891989 }
lib/std/target.zig+156-30
......@@ -172,6 +172,48 @@ pub const Target = union(enum) {
172172 r6,
173173 };
174174
175 pub fn subArchFeature(arch: Arch) ?u8 {
176 return switch (arch) {
177 .arm, .armeb, .thumb, .thumbeb => |arm32| switch (arm32) {
178 .v8_5a => @enumToInt(arm.Feature.armv8_5_a),
179 .v8_4a => @enumToInt(arm.Feature.armv8_4_a),
180 .v8_3a => @enumToInt(arm.Feature.armv8_3_a),
181 .v8_2a => @enumToInt(arm.Feature.armv8_2_a),
182 .v8_1a => @enumToInt(arm.Feature.armv8_1_a),
183 .v8 => @enumToInt(arm.Feature.armv8_a),
184 .v8r => @enumToInt(arm.Feature.armv8_r),
185 .v8m_baseline => @enumToInt(arm.Feature.armv8_m_base),
186 .v8m_mainline => @enumToInt(arm.Feature.armv8_m_main),
187 .v8_1m_mainline => @enumToInt(arm.Feature.armv8_1_m_main),
188 .v7 => @enumToInt(arm.Feature.armv7_a),
189 .v7em => @enumToInt(arm.Feature.armv7e_m),
190 .v7m => @enumToInt(arm.Feature.armv7_m),
191 .v7s => @enumToInt(arm.Feature.armv7s),
192 .v7k => @enumToInt(arm.Feature.armv7k),
193 .v7ve => @enumToInt(arm.Feature.armv7ve),
194 .v6 => @enumToInt(arm.Feature.armv6),
195 .v6m => @enumToInt(arm.Feature.armv6_m),
196 .v6k => @enumToInt(arm.Feature.armv6k),
197 .v6t2 => @enumToInt(arm.Feature.armv6t2),
198 .v5 => @enumToInt(arm.Feature.armv5t),
199 .v5te => @enumToInt(arm.Feature.armv5te),
200 .v4t => @enumToInt(arm.Feature.armv4t),
201 },
202 .aarch64, .aarch64_be, .aarch64_32 => |arm64| switch (arm64) {
203 .v8_5a => @enumToInt(aarch64.Feature.v8_5a),
204 .v8_4a => @enumToInt(aarch64.Feature.v8_4a),
205 .v8_3a => @enumToInt(aarch64.Feature.v8_3a),
206 .v8_2a => @enumToInt(aarch64.Feature.v8_2a),
207 .v8_1a => @enumToInt(aarch64.Feature.v8_1a),
208 .v8 => @enumToInt(aarch64.Feature.v8_1a),
209 .v8r => @enumToInt(aarch64.Feature.v8_1a),
210 .v8m_baseline => @enumToInt(aarch64.Feature.v8_1a),
211 .v8m_mainline => @enumToInt(aarch64.Feature.v8_1a),
212 },
213 else => return null,
214 };
215 }
216
175217 pub fn isARM(arch: Arch) bool {
176218 return switch (arch) {
177219 .arm, .armeb => true,
......@@ -219,7 +261,7 @@ pub const Target = union(enum) {
219261 pub fn parseCpuFeatureSet(arch: Arch, features_text: []const u8) !Cpu.Feature.Set {
220262 // Here we compute both and choose the correct result at the end, based
221263 // on whether or not we saw + and - signs.
222 var whitelist_set = Cpu.Feature.Set.empty();
264 var whitelist_set = Cpu.Feature.Set.empty;
223265 var baseline_set = arch.baselineFeatures();
224266 var mode: enum {
225267 unknown,
......@@ -256,16 +298,18 @@ pub const Target = union(enum) {
256298 op = .add;
257299 feature_name = item_text;
258300 }
259 for (arch.allFeaturesList()) |feature, index| {
301 const all_features = arch.allFeaturesList();
302 for (all_features) |feature, index_usize| {
303 const index = @intCast(Cpu.Feature.Set.Index, index_usize);
260304 if (mem.eql(u8, feature_name, feature.name)) {
261305 switch (op) {
262306 .add => {
263 baseline_set.addFeature(@intCast(u8, index));
264 whitelist_set.addFeature(@intCast(u8, index));
307 baseline_set.addFeature(index, all_features);
308 whitelist_set.addFeature(index, all_features);
265309 },
266310 .sub => {
267 baseline_set.removeFeature(@intCast(u8, index));
268 whitelist_set.removeFeature(@intCast(u8, index));
311 baseline_set.removeFeature(index, all_features);
312 whitelist_set.removeFeature(index, all_features);
269313 },
270314 }
271315 break;
......@@ -462,7 +506,7 @@ pub const Target = union(enum) {
462506 .nvptx, .nvptx64 => nvptx.cpu.sm_20.features,
463507 .wasm32, .wasm64 => wasm.cpu.generic.features,
464508
465 else => Cpu.Feature.Set.empty(),
509 else => Cpu.Feature.Set.empty,
466510 };
467511 }
468512
......@@ -521,48 +565,130 @@ pub const Target = union(enum) {
521565 features: Feature.Set,
522566
523567 pub const Feature = struct {
524 /// The bit index into `Set`.
525 index: u8,
526 name: []const u8,
568 /// The bit index into `Set`. Has a default value of `undefined` because the canonical
569 /// structures are populated via comptime logic.
570 index: Set.Index = undefined,
571
572 /// Has a default value of `undefined` because the canonical
573 /// structures are populated via comptime logic.
574 name: []const u8 = undefined,
575
576 /// If this corresponds to an LLVM-recognized feature, this will be populated;
577 /// otherwise null.
527578 llvm_name: ?[:0]const u8,
579
580 /// Human-friendly UTF-8 text.
528581 description: []const u8,
529 dependencies: Set,
582
583 /// `Set` of all features this depends on, and this feature itself.
584 /// Can be "or"ed with another set to remove this feature and all
585 /// its dependencies.
586 /// Has a default value of `undefined` because the canonical
587 /// structures are populated via comptime logic.
588 dependencies: Set = undefined,
530589
531590 /// A bit set of all the features.
532591 pub const Set = struct {
533 bytes: [bit_count / 8]u8,
592 ints: [usize_count]usize,
593
594 pub const needed_bit_count = 174;
595 pub const byte_count = (needed_bit_count + 7) / 8;
596 pub const usize_count = (byte_count + (@sizeOf(usize) - 1)) / @sizeOf(usize);
597 pub const Index = std.math.Log2Int(@IntType(false, usize_count * @bitSizeOf(usize)));
598 pub const ShiftInt = std.math.Log2Int(usize);
599
600 pub const empty = Set{ .ints = [1]usize{0} ** usize_count };
601
602 pub fn isEnabled(set: Set, arch_feature_index: Index) bool {
603 const usize_index = arch_feature_index / @bitSizeOf(usize);
604 const bit_index = @intCast(ShiftInt, arch_feature_index % @bitSizeOf(usize));
605 return (set.ints[usize_index] & (@as(usize, 1) << bit_index)) != 0;
606 }
607
608 /// Adds the specified feature and all its dependencies to the set. O(1).
609 pub fn addFeature(
610 set: *Set,
611 arch_feature_index: Index,
612 all_features_list: []const Cpu.Feature,
613 ) void {
614 set.ints = @as(@Vector(usize_count, usize), set.ints) |
615 @as(@Vector(usize_count, usize), all_features_list[arch_feature_index].dependencies.ints);
616 }
534617
535 pub const bit_count = 22 * 8;
618 /// Removes the specified feature (TODO and all its dependents) from the set. O(1).
619 /// TODO improve this function to actually handle dependants rather than just calling
620 /// `removeSparseFeature`.
621 pub fn removeFeature(
622 set: *Set,
623 arch_feature_index: Index,
624 all_features_list: []const Cpu.Feature,
625 ) void {
626 set.removeSparseFeature(arch_feature_index);
627 }
536628
537 pub fn empty() Set {
538 return .{ .bytes = [1]u8{0} ** 22 };
629 /// Adds the specified feature but not its dependencies.
630 pub fn addSparseFeature(set: *Set, arch_feature_index: Index) void {
631 const usize_index = arch_feature_index / @bitSizeOf(usize);
632 const bit_index = @intCast(ShiftInt, arch_feature_index % @bitSizeOf(usize));
633 set.ints[usize_index] |= @as(usize, 1) << bit_index;
539634 }
540635
541 pub fn isEnabled(set: Set, arch_feature_index: u8) bool {
542 const byte_index = arch_feature_index / 8;
543 const bit_index = @intCast(u3, arch_feature_index % 8);
544 return (set.bytes[byte_index] & (@as(u8, 1) << bit_index)) != 0;
636 /// Removes the specified feature but not its dependents.
637 pub fn removeSparseFeature(set: *Set, arch_feature_index: Index) void {
638 const usize_index = arch_feature_index / @bitSizeOf(usize);
639 const bit_index = @intCast(ShiftInt, arch_feature_index % @bitSizeOf(usize));
640 set.ints[usize_index] &= ~(@as(usize, 1) << bit_index);
545641 }
546642
547 pub fn addFeature(set: *Set, arch_feature_index: u8) void {
548 const byte_index = arch_feature_index / 8;
549 const bit_index = @intCast(u3, arch_feature_index % 8);
550 set.bytes[byte_index] |= @as(u8, 1) << bit_index;
643 pub fn initAsDependencies(
644 set: *Set,
645 arch_feature_index: Index,
646 all_features_list: []const Cpu.Feature,
647 ) void {
648 // fast-case to help reduce how much comptime code must execute
649 const no_deps = for (set.ints) |elem| {
650 if (elem != 0) break false;
651 } else true;
652 // add itself to its own dependencies for easy "or"ing later
653 set.addSparseFeature(arch_feature_index);
654 if (no_deps) return;
655
656 var old = set.ints;
657 while (true) {
658 for (all_features_list) |feature, index| {
659 const casted_index = @intCast(Index, index);
660 if (set.isEnabled(casted_index)) {
661 set.addFeature(casted_index, all_features_list);
662 }
663 }
664 const nothing_changed = mem.eql(usize, &old, &set.ints);
665 if (nothing_changed) return;
666 old = set.ints;
667 }
551668 }
552669
553 pub fn removeFeature(set: *Set, arch_feature_index: u8) void {
554 const byte_index = arch_feature_index / 8;
555 const bit_index = @intCast(u3, arch_feature_index % 8);
556 set.bytes[byte_index] &= ~(@as(u8, 1) << bit_index);
670 pub fn asBytes(set: *const Set) *const [byte_count]u8 {
671 return @ptrCast(*const [byte_count]u8, &set.ints);
557672 }
558673 };
559674
560675 pub fn feature_set_fns(comptime F: type) type {
561676 return struct {
562 pub fn featureSet(features: []const F) Set {
563 var x = Set.empty();
677 /// Populates a set with the list of features and all their dependencies included.
678 pub fn featureSet(all_features_list: []const Feature, features: []const F) Set {
679 var x: Set = Set.empty;
680 for (features) |feature| {
681 x.addFeature(@enumToInt(feature), all_features_list);
682 }
683 @compileLog(Set.empty);
684 return x;
685 }
686
687 /// Populates only the feature bits specified.
688 pub fn sparseFeatureSet(features: []const F) Set {
689 var x = Set.empty;
564690 for (features) |feature| {
565 x.addFeature(@enumToInt(feature));
691 x.addSparseFeature(@enumToInt(feature));
566692 }
567693 return x;
568694 }
lib/std/target/aarch64.zig+181-466
......@@ -153,15 +153,14 @@ pub const Feature = enum {
153153pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
154154
155155pub const all_features = blk: {
156 @setEvalBranchQuota(10000);
156157 const len = @typeInfo(Feature).Enum.fields.len;
157 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
158 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
158159 var result: [len]Cpu.Feature = undefined;
159160 result[@enumToInt(Feature.a35)] = .{
160 .index = @enumToInt(Feature.a35),
161 .name = @tagName(Feature.a35),
162161 .llvm_name = "a35",
163162 .description = "Cortex-A35 ARM processors",
164 .dependencies = featureSet(&[_]Feature{
163 .dependencies = sparseFeatureSet(&[_]Feature{
165164 .crc,
166165 .crypto,
167166 .fp_armv8,
......@@ -170,11 +169,9 @@ pub const all_features = blk: {
170169 }),
171170 };
172171 result[@enumToInt(Feature.a53)] = .{
173 .index = @enumToInt(Feature.a53),
174 .name = @tagName(Feature.a53),
175172 .llvm_name = "a53",
176173 .description = "Cortex-A53 ARM processors",
177 .dependencies = featureSet(&[_]Feature{
174 .dependencies = sparseFeatureSet(&[_]Feature{
178175 .balance_fp_ops,
179176 .crc,
180177 .crypto,
......@@ -188,11 +185,9 @@ pub const all_features = blk: {
188185 }),
189186 };
190187 result[@enumToInt(Feature.a55)] = .{
191 .index = @enumToInt(Feature.a55),
192 .name = @tagName(Feature.a55),
193188 .llvm_name = "a55",
194189 .description = "Cortex-A55 ARM processors",
195 .dependencies = featureSet(&[_]Feature{
190 .dependencies = sparseFeatureSet(&[_]Feature{
196191 .crypto,
197192 .dotprod,
198193 .fp_armv8,
......@@ -205,11 +200,9 @@ pub const all_features = blk: {
205200 }),
206201 };
207202 result[@enumToInt(Feature.a57)] = .{
208 .index = @enumToInt(Feature.a57),
209 .name = @tagName(Feature.a57),
210203 .llvm_name = "a57",
211204 .description = "Cortex-A57 ARM processors",
212 .dependencies = featureSet(&[_]Feature{
205 .dependencies = sparseFeatureSet(&[_]Feature{
213206 .balance_fp_ops,
214207 .crc,
215208 .crypto,
......@@ -224,11 +217,9 @@ pub const all_features = blk: {
224217 }),
225218 };
226219 result[@enumToInt(Feature.a72)] = .{
227 .index = @enumToInt(Feature.a72),
228 .name = @tagName(Feature.a72),
229220 .llvm_name = "a72",
230221 .description = "Cortex-A72 ARM processors",
231 .dependencies = featureSet(&[_]Feature{
222 .dependencies = sparseFeatureSet(&[_]Feature{
232223 .crc,
233224 .crypto,
234225 .fp_armv8,
......@@ -238,11 +229,9 @@ pub const all_features = blk: {
238229 }),
239230 };
240231 result[@enumToInt(Feature.a73)] = .{
241 .index = @enumToInt(Feature.a73),
242 .name = @tagName(Feature.a73),
243232 .llvm_name = "a73",
244233 .description = "Cortex-A73 ARM processors",
245 .dependencies = featureSet(&[_]Feature{
234 .dependencies = sparseFeatureSet(&[_]Feature{
246235 .crc,
247236 .crypto,
248237 .fp_armv8,
......@@ -252,11 +241,9 @@ pub const all_features = blk: {
252241 }),
253242 };
254243 result[@enumToInt(Feature.a75)] = .{
255 .index = @enumToInt(Feature.a75),
256 .name = @tagName(Feature.a75),
257244 .llvm_name = "a75",
258245 .description = "Cortex-A75 ARM processors",
259 .dependencies = featureSet(&[_]Feature{
246 .dependencies = sparseFeatureSet(&[_]Feature{
260247 .crypto,
261248 .dotprod,
262249 .fp_armv8,
......@@ -269,11 +256,9 @@ pub const all_features = blk: {
269256 }),
270257 };
271258 result[@enumToInt(Feature.a76)] = .{
272 .index = @enumToInt(Feature.a76),
273 .name = @tagName(Feature.a76),
274259 .llvm_name = "a76",
275260 .description = "Cortex-A76 ARM processors",
276 .dependencies = featureSet(&[_]Feature{
261 .dependencies = sparseFeatureSet(&[_]Feature{
277262 .crypto,
278263 .dotprod,
279264 .fp_armv8,
......@@ -285,194 +270,142 @@ pub const all_features = blk: {
285270 }),
286271 };
287272 result[@enumToInt(Feature.aes)] = .{
288 .index = @enumToInt(Feature.aes),
289 .name = @tagName(Feature.aes),
290273 .llvm_name = "aes",
291274 .description = "Enable AES support",
292 .dependencies = featureSet(&[_]Feature{
275 .dependencies = sparseFeatureSet(&[_]Feature{
293276 .neon,
294277 }),
295278 };
296279 result[@enumToInt(Feature.aggressive_fma)] = .{
297 .index = @enumToInt(Feature.aggressive_fma),
298 .name = @tagName(Feature.aggressive_fma),
299280 .llvm_name = "aggressive-fma",
300281 .description = "Enable Aggressive FMA for floating-point.",
301 .dependencies = featureSet(&[_]Feature{}),
282 .dependencies = sparseFeatureSet(&[_]Feature{}),
302283 };
303284 result[@enumToInt(Feature.alternate_sextload_cvt_f32_pattern)] = .{
304 .index = @enumToInt(Feature.alternate_sextload_cvt_f32_pattern),
305 .name = @tagName(Feature.alternate_sextload_cvt_f32_pattern),
306285 .llvm_name = "alternate-sextload-cvt-f32-pattern",
307286 .description = "Use alternative pattern for sextload convert to f32",
308 .dependencies = featureSet(&[_]Feature{}),
287 .dependencies = sparseFeatureSet(&[_]Feature{}),
309288 };
310289 result[@enumToInt(Feature.altnzcv)] = .{
311 .index = @enumToInt(Feature.altnzcv),
312 .name = @tagName(Feature.altnzcv),
313290 .llvm_name = "altnzcv",
314291 .description = "Enable alternative NZCV format for floating point comparisons",
315 .dependencies = featureSet(&[_]Feature{}),
292 .dependencies = sparseFeatureSet(&[_]Feature{}),
316293 };
317294 result[@enumToInt(Feature.am)] = .{
318 .index = @enumToInt(Feature.am),
319 .name = @tagName(Feature.am),
320295 .llvm_name = "am",
321296 .description = "Enable v8.4-A Activity Monitors extension",
322 .dependencies = featureSet(&[_]Feature{}),
297 .dependencies = sparseFeatureSet(&[_]Feature{}),
323298 };
324299 result[@enumToInt(Feature.arith_bcc_fusion)] = .{
325 .index = @enumToInt(Feature.arith_bcc_fusion),
326 .name = @tagName(Feature.arith_bcc_fusion),
327300 .llvm_name = "arith-bcc-fusion",
328301 .description = "CPU fuses arithmetic+bcc operations",
329 .dependencies = featureSet(&[_]Feature{}),
302 .dependencies = sparseFeatureSet(&[_]Feature{}),
330303 };
331304 result[@enumToInt(Feature.arith_cbz_fusion)] = .{
332 .index = @enumToInt(Feature.arith_cbz_fusion),
333 .name = @tagName(Feature.arith_cbz_fusion),
334305 .llvm_name = "arith-cbz-fusion",
335306 .description = "CPU fuses arithmetic + cbz/cbnz operations",
336 .dependencies = featureSet(&[_]Feature{}),
307 .dependencies = sparseFeatureSet(&[_]Feature{}),
337308 };
338309 result[@enumToInt(Feature.balance_fp_ops)] = .{
339 .index = @enumToInt(Feature.balance_fp_ops),
340 .name = @tagName(Feature.balance_fp_ops),
341310 .llvm_name = "balance-fp-ops",
342311 .description = "balance mix of odd and even D-registers for fp multiply(-accumulate) ops",
343 .dependencies = featureSet(&[_]Feature{}),
312 .dependencies = sparseFeatureSet(&[_]Feature{}),
344313 };
345314 result[@enumToInt(Feature.bti)] = .{
346 .index = @enumToInt(Feature.bti),
347 .name = @tagName(Feature.bti),
348315 .llvm_name = "bti",
349316 .description = "Enable Branch Target Identification",
350 .dependencies = featureSet(&[_]Feature{}),
317 .dependencies = sparseFeatureSet(&[_]Feature{}),
351318 };
352319 result[@enumToInt(Feature.call_saved_x10)] = .{
353 .index = @enumToInt(Feature.call_saved_x10),
354 .name = @tagName(Feature.call_saved_x10),
355320 .llvm_name = "call-saved-x10",
356321 .description = "Make X10 callee saved.",
357 .dependencies = featureSet(&[_]Feature{}),
322 .dependencies = sparseFeatureSet(&[_]Feature{}),
358323 };
359324 result[@enumToInt(Feature.call_saved_x11)] = .{
360 .index = @enumToInt(Feature.call_saved_x11),
361 .name = @tagName(Feature.call_saved_x11),
362325 .llvm_name = "call-saved-x11",
363326 .description = "Make X11 callee saved.",
364 .dependencies = featureSet(&[_]Feature{}),
327 .dependencies = sparseFeatureSet(&[_]Feature{}),
365328 };
366329 result[@enumToInt(Feature.call_saved_x12)] = .{
367 .index = @enumToInt(Feature.call_saved_x12),
368 .name = @tagName(Feature.call_saved_x12),
369330 .llvm_name = "call-saved-x12",
370331 .description = "Make X12 callee saved.",
371 .dependencies = featureSet(&[_]Feature{}),
332 .dependencies = sparseFeatureSet(&[_]Feature{}),
372333 };
373334 result[@enumToInt(Feature.call_saved_x13)] = .{
374 .index = @enumToInt(Feature.call_saved_x13),
375 .name = @tagName(Feature.call_saved_x13),
376335 .llvm_name = "call-saved-x13",
377336 .description = "Make X13 callee saved.",
378 .dependencies = featureSet(&[_]Feature{}),
337 .dependencies = sparseFeatureSet(&[_]Feature{}),
379338 };
380339 result[@enumToInt(Feature.call_saved_x14)] = .{
381 .index = @enumToInt(Feature.call_saved_x14),
382 .name = @tagName(Feature.call_saved_x14),
383340 .llvm_name = "call-saved-x14",
384341 .description = "Make X14 callee saved.",
385 .dependencies = featureSet(&[_]Feature{}),
342 .dependencies = sparseFeatureSet(&[_]Feature{}),
386343 };
387344 result[@enumToInt(Feature.call_saved_x15)] = .{
388 .index = @enumToInt(Feature.call_saved_x15),
389 .name = @tagName(Feature.call_saved_x15),
390345 .llvm_name = "call-saved-x15",
391346 .description = "Make X15 callee saved.",
392 .dependencies = featureSet(&[_]Feature{}),
347 .dependencies = sparseFeatureSet(&[_]Feature{}),
393348 };
394349 result[@enumToInt(Feature.call_saved_x18)] = .{
395 .index = @enumToInt(Feature.call_saved_x18),
396 .name = @tagName(Feature.call_saved_x18),
397350 .llvm_name = "call-saved-x18",
398351 .description = "Make X18 callee saved.",
399 .dependencies = featureSet(&[_]Feature{}),
352 .dependencies = sparseFeatureSet(&[_]Feature{}),
400353 };
401354 result[@enumToInt(Feature.call_saved_x8)] = .{
402 .index = @enumToInt(Feature.call_saved_x8),
403 .name = @tagName(Feature.call_saved_x8),
404355 .llvm_name = "call-saved-x8",
405356 .description = "Make X8 callee saved.",
406 .dependencies = featureSet(&[_]Feature{}),
357 .dependencies = sparseFeatureSet(&[_]Feature{}),
407358 };
408359 result[@enumToInt(Feature.call_saved_x9)] = .{
409 .index = @enumToInt(Feature.call_saved_x9),
410 .name = @tagName(Feature.call_saved_x9),
411360 .llvm_name = "call-saved-x9",
412361 .description = "Make X9 callee saved.",
413 .dependencies = featureSet(&[_]Feature{}),
362 .dependencies = sparseFeatureSet(&[_]Feature{}),
414363 };
415364 result[@enumToInt(Feature.ccdp)] = .{
416 .index = @enumToInt(Feature.ccdp),
417 .name = @tagName(Feature.ccdp),
418365 .llvm_name = "ccdp",
419366 .description = "Enable v8.5 Cache Clean to Point of Deep Persistence",
420 .dependencies = featureSet(&[_]Feature{}),
367 .dependencies = sparseFeatureSet(&[_]Feature{}),
421368 };
422369 result[@enumToInt(Feature.ccidx)] = .{
423 .index = @enumToInt(Feature.ccidx),
424 .name = @tagName(Feature.ccidx),
425370 .llvm_name = "ccidx",
426371 .description = "Enable v8.3-A Extend of the CCSIDR number of sets",
427 .dependencies = featureSet(&[_]Feature{}),
372 .dependencies = sparseFeatureSet(&[_]Feature{}),
428373 };
429374 result[@enumToInt(Feature.ccpp)] = .{
430 .index = @enumToInt(Feature.ccpp),
431 .name = @tagName(Feature.ccpp),
432375 .llvm_name = "ccpp",
433376 .description = "Enable v8.2 data Cache Clean to Point of Persistence",
434 .dependencies = featureSet(&[_]Feature{}),
377 .dependencies = sparseFeatureSet(&[_]Feature{}),
435378 };
436379 result[@enumToInt(Feature.complxnum)] = .{
437 .index = @enumToInt(Feature.complxnum),
438 .name = @tagName(Feature.complxnum),
439380 .llvm_name = "complxnum",
440381 .description = "Enable v8.3-A Floating-point complex number support",
441 .dependencies = featureSet(&[_]Feature{
382 .dependencies = sparseFeatureSet(&[_]Feature{
442383 .neon,
443384 }),
444385 };
445386 result[@enumToInt(Feature.crc)] = .{
446 .index = @enumToInt(Feature.crc),
447 .name = @tagName(Feature.crc),
448387 .llvm_name = "crc",
449388 .description = "Enable ARMv8 CRC-32 checksum instructions",
450 .dependencies = featureSet(&[_]Feature{}),
389 .dependencies = sparseFeatureSet(&[_]Feature{}),
451390 };
452391 result[@enumToInt(Feature.crypto)] = .{
453 .index = @enumToInt(Feature.crypto),
454 .name = @tagName(Feature.crypto),
455392 .llvm_name = "crypto",
456393 .description = "Enable cryptographic instructions",
457 .dependencies = featureSet(&[_]Feature{
394 .dependencies = sparseFeatureSet(&[_]Feature{
458395 .aes,
459396 .neon,
460397 .sha2,
461398 }),
462399 };
463400 result[@enumToInt(Feature.custom_cheap_as_move)] = .{
464 .index = @enumToInt(Feature.custom_cheap_as_move),
465 .name = @tagName(Feature.custom_cheap_as_move),
466401 .llvm_name = "custom-cheap-as-move",
467402 .description = "Use custom handling of cheap instructions",
468 .dependencies = featureSet(&[_]Feature{}),
403 .dependencies = sparseFeatureSet(&[_]Feature{}),
469404 };
470405 result[@enumToInt(Feature.cyclone)] = .{
471 .index = @enumToInt(Feature.cyclone),
472 .name = @tagName(Feature.cyclone),
473406 .llvm_name = "cyclone",
474407 .description = "Cyclone",
475 .dependencies = featureSet(&[_]Feature{
408 .dependencies = sparseFeatureSet(&[_]Feature{
476409 .alternate_sextload_cvt_f32_pattern,
477410 .arith_bcc_fusion,
478411 .arith_cbz_fusion,
......@@ -489,41 +422,31 @@ pub const all_features = blk: {
489422 }),
490423 };
491424 result[@enumToInt(Feature.disable_latency_sched_heuristic)] = .{
492 .index = @enumToInt(Feature.disable_latency_sched_heuristic),
493 .name = @tagName(Feature.disable_latency_sched_heuristic),
494425 .llvm_name = "disable-latency-sched-heuristic",
495426 .description = "Disable latency scheduling heuristic",
496 .dependencies = featureSet(&[_]Feature{}),
427 .dependencies = sparseFeatureSet(&[_]Feature{}),
497428 };
498429 result[@enumToInt(Feature.dit)] = .{
499 .index = @enumToInt(Feature.dit),
500 .name = @tagName(Feature.dit),
501430 .llvm_name = "dit",
502431 .description = "Enable v8.4-A Data Independent Timing instructions",
503 .dependencies = featureSet(&[_]Feature{}),
432 .dependencies = sparseFeatureSet(&[_]Feature{}),
504433 };
505434 result[@enumToInt(Feature.dotprod)] = .{
506 .index = @enumToInt(Feature.dotprod),
507 .name = @tagName(Feature.dotprod),
508435 .llvm_name = "dotprod",
509436 .description = "Enable dot product support",
510 .dependencies = featureSet(&[_]Feature{}),
437 .dependencies = sparseFeatureSet(&[_]Feature{}),
511438 };
512439 result[@enumToInt(Feature.exynos_cheap_as_move)] = .{
513 .index = @enumToInt(Feature.exynos_cheap_as_move),
514 .name = @tagName(Feature.exynos_cheap_as_move),
515440 .llvm_name = "exynos-cheap-as-move",
516441 .description = "Use Exynos specific handling of cheap instructions",
517 .dependencies = featureSet(&[_]Feature{
442 .dependencies = sparseFeatureSet(&[_]Feature{
518443 .custom_cheap_as_move,
519444 }),
520445 };
521446 result[@enumToInt(Feature.exynosm1)] = .{
522 .index = @enumToInt(Feature.exynosm1),
523 .name = @tagName(Feature.exynosm1),
524447 .llvm_name = "exynosm1",
525448 .description = "Samsung Exynos-M1 processors",
526 .dependencies = featureSet(&[_]Feature{
449 .dependencies = sparseFeatureSet(&[_]Feature{
527450 .crc,
528451 .crypto,
529452 .exynos_cheap_as_move,
......@@ -538,11 +461,9 @@ pub const all_features = blk: {
538461 }),
539462 };
540463 result[@enumToInt(Feature.exynosm2)] = .{
541 .index = @enumToInt(Feature.exynosm2),
542 .name = @tagName(Feature.exynosm2),
543464 .llvm_name = "exynosm2",
544465 .description = "Samsung Exynos-M2 processors",
545 .dependencies = featureSet(&[_]Feature{
466 .dependencies = sparseFeatureSet(&[_]Feature{
546467 .crc,
547468 .crypto,
548469 .exynos_cheap_as_move,
......@@ -556,11 +477,9 @@ pub const all_features = blk: {
556477 }),
557478 };
558479 result[@enumToInt(Feature.exynosm3)] = .{
559 .index = @enumToInt(Feature.exynosm3),
560 .name = @tagName(Feature.exynosm3),
561480 .llvm_name = "exynosm3",
562481 .description = "Samsung Exynos-M3 processors",
563 .dependencies = featureSet(&[_]Feature{
482 .dependencies = sparseFeatureSet(&[_]Feature{
564483 .crc,
565484 .crypto,
566485 .exynos_cheap_as_move,
......@@ -577,11 +496,9 @@ pub const all_features = blk: {
577496 }),
578497 };
579498 result[@enumToInt(Feature.exynosm4)] = .{
580 .index = @enumToInt(Feature.exynosm4),
581 .name = @tagName(Feature.exynosm4),
582499 .llvm_name = "exynosm4",
583500 .description = "Samsung Exynos-M4 processors",
584 .dependencies = featureSet(&[_]Feature{
501 .dependencies = sparseFeatureSet(&[_]Feature{
585502 .arith_bcc_fusion,
586503 .arith_cbz_fusion,
587504 .crypto,
......@@ -602,11 +519,9 @@ pub const all_features = blk: {
602519 }),
603520 };
604521 result[@enumToInt(Feature.falkor)] = .{
605 .index = @enumToInt(Feature.falkor),
606 .name = @tagName(Feature.falkor),
607522 .llvm_name = "falkor",
608523 .description = "Qualcomm Falkor processors",
609 .dependencies = featureSet(&[_]Feature{
524 .dependencies = sparseFeatureSet(&[_]Feature{
610525 .crc,
611526 .crypto,
612527 .custom_cheap_as_move,
......@@ -622,108 +537,80 @@ pub const all_features = blk: {
622537 }),
623538 };
624539 result[@enumToInt(Feature.fmi)] = .{
625 .index = @enumToInt(Feature.fmi),
626 .name = @tagName(Feature.fmi),
627540 .llvm_name = "fmi",
628541 .description = "Enable v8.4-A Flag Manipulation Instructions",
629 .dependencies = featureSet(&[_]Feature{}),
542 .dependencies = sparseFeatureSet(&[_]Feature{}),
630543 };
631544 result[@enumToInt(Feature.force_32bit_jump_tables)] = .{
632 .index = @enumToInt(Feature.force_32bit_jump_tables),
633 .name = @tagName(Feature.force_32bit_jump_tables),
634545 .llvm_name = "force-32bit-jump-tables",
635546 .description = "Force jump table entries to be 32-bits wide except at MinSize",
636 .dependencies = featureSet(&[_]Feature{}),
547 .dependencies = sparseFeatureSet(&[_]Feature{}),
637548 };
638549 result[@enumToInt(Feature.fp_armv8)] = .{
639 .index = @enumToInt(Feature.fp_armv8),
640 .name = @tagName(Feature.fp_armv8),
641550 .llvm_name = "fp-armv8",
642551 .description = "Enable ARMv8 FP",
643 .dependencies = featureSet(&[_]Feature{}),
552 .dependencies = sparseFeatureSet(&[_]Feature{}),
644553 };
645554 result[@enumToInt(Feature.fp16fml)] = .{
646 .index = @enumToInt(Feature.fp16fml),
647 .name = @tagName(Feature.fp16fml),
648555 .llvm_name = "fp16fml",
649556 .description = "Enable FP16 FML instructions",
650 .dependencies = featureSet(&[_]Feature{
557 .dependencies = sparseFeatureSet(&[_]Feature{
651558 .fullfp16,
652559 }),
653560 };
654561 result[@enumToInt(Feature.fptoint)] = .{
655 .index = @enumToInt(Feature.fptoint),
656 .name = @tagName(Feature.fptoint),
657562 .llvm_name = "fptoint",
658563 .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",
659 .dependencies = featureSet(&[_]Feature{}),
564 .dependencies = sparseFeatureSet(&[_]Feature{}),
660565 };
661566 result[@enumToInt(Feature.fullfp16)] = .{
662 .index = @enumToInt(Feature.fullfp16),
663 .name = @tagName(Feature.fullfp16),
664567 .llvm_name = "fullfp16",
665568 .description = "Full FP16",
666 .dependencies = featureSet(&[_]Feature{
569 .dependencies = sparseFeatureSet(&[_]Feature{
667570 .fp_armv8,
668571 }),
669572 };
670573 result[@enumToInt(Feature.fuse_address)] = .{
671 .index = @enumToInt(Feature.fuse_address),
672 .name = @tagName(Feature.fuse_address),
673574 .llvm_name = "fuse-address",
674575 .description = "CPU fuses address generation and memory operations",
675 .dependencies = featureSet(&[_]Feature{}),
576 .dependencies = sparseFeatureSet(&[_]Feature{}),
676577 };
677578 result[@enumToInt(Feature.fuse_aes)] = .{
678 .index = @enumToInt(Feature.fuse_aes),
679 .name = @tagName(Feature.fuse_aes),
680579 .llvm_name = "fuse-aes",
681580 .description = "CPU fuses AES crypto operations",
682 .dependencies = featureSet(&[_]Feature{}),
581 .dependencies = sparseFeatureSet(&[_]Feature{}),
683582 };
684583 result[@enumToInt(Feature.fuse_arith_logic)] = .{
685 .index = @enumToInt(Feature.fuse_arith_logic),
686 .name = @tagName(Feature.fuse_arith_logic),
687584 .llvm_name = "fuse-arith-logic",
688585 .description = "CPU fuses arithmetic and logic operations",
689 .dependencies = featureSet(&[_]Feature{}),
586 .dependencies = sparseFeatureSet(&[_]Feature{}),
690587 };
691588 result[@enumToInt(Feature.fuse_crypto_eor)] = .{
692 .index = @enumToInt(Feature.fuse_crypto_eor),
693 .name = @tagName(Feature.fuse_crypto_eor),
694589 .llvm_name = "fuse-crypto-eor",
695590 .description = "CPU fuses AES/PMULL and EOR operations",
696 .dependencies = featureSet(&[_]Feature{}),
591 .dependencies = sparseFeatureSet(&[_]Feature{}),
697592 };
698593 result[@enumToInt(Feature.fuse_csel)] = .{
699 .index = @enumToInt(Feature.fuse_csel),
700 .name = @tagName(Feature.fuse_csel),
701594 .llvm_name = "fuse-csel",
702595 .description = "CPU fuses conditional select operations",
703 .dependencies = featureSet(&[_]Feature{}),
596 .dependencies = sparseFeatureSet(&[_]Feature{}),
704597 };
705598 result[@enumToInt(Feature.fuse_literals)] = .{
706 .index = @enumToInt(Feature.fuse_literals),
707 .name = @tagName(Feature.fuse_literals),
708599 .llvm_name = "fuse-literals",
709600 .description = "CPU fuses literal generation operations",
710 .dependencies = featureSet(&[_]Feature{}),
601 .dependencies = sparseFeatureSet(&[_]Feature{}),
711602 };
712603 result[@enumToInt(Feature.jsconv)] = .{
713 .index = @enumToInt(Feature.jsconv),
714 .name = @tagName(Feature.jsconv),
715604 .llvm_name = "jsconv",
716605 .description = "Enable v8.3-A JavaScript FP conversion enchancement",
717 .dependencies = featureSet(&[_]Feature{
606 .dependencies = sparseFeatureSet(&[_]Feature{
718607 .fp_armv8,
719608 }),
720609 };
721610 result[@enumToInt(Feature.kryo)] = .{
722 .index = @enumToInt(Feature.kryo),
723 .name = @tagName(Feature.kryo),
724611 .llvm_name = "kryo",
725612 .description = "Qualcomm Kryo processors",
726 .dependencies = featureSet(&[_]Feature{
613 .dependencies = sparseFeatureSet(&[_]Feature{
727614 .crc,
728615 .crypto,
729616 .custom_cheap_as_move,
......@@ -737,327 +624,237 @@ pub const all_features = blk: {
737624 }),
738625 };
739626 result[@enumToInt(Feature.lor)] = .{
740 .index = @enumToInt(Feature.lor),
741 .name = @tagName(Feature.lor),
742627 .llvm_name = "lor",
743628 .description = "Enables ARM v8.1 Limited Ordering Regions extension",
744 .dependencies = featureSet(&[_]Feature{}),
629 .dependencies = sparseFeatureSet(&[_]Feature{}),
745630 };
746631 result[@enumToInt(Feature.lse)] = .{
747 .index = @enumToInt(Feature.lse),
748 .name = @tagName(Feature.lse),
749632 .llvm_name = "lse",
750633 .description = "Enable ARMv8.1 Large System Extension (LSE) atomic instructions",
751 .dependencies = featureSet(&[_]Feature{}),
634 .dependencies = sparseFeatureSet(&[_]Feature{}),
752635 };
753636 result[@enumToInt(Feature.lsl_fast)] = .{
754 .index = @enumToInt(Feature.lsl_fast),
755 .name = @tagName(Feature.lsl_fast),
756637 .llvm_name = "lsl-fast",
757638 .description = "CPU has a fastpath logical shift of up to 3 places",
758 .dependencies = featureSet(&[_]Feature{}),
639 .dependencies = sparseFeatureSet(&[_]Feature{}),
759640 };
760641 result[@enumToInt(Feature.mpam)] = .{
761 .index = @enumToInt(Feature.mpam),
762 .name = @tagName(Feature.mpam),
763642 .llvm_name = "mpam",
764643 .description = "Enable v8.4-A Memory system Partitioning and Monitoring extension",
765 .dependencies = featureSet(&[_]Feature{}),
644 .dependencies = sparseFeatureSet(&[_]Feature{}),
766645 };
767646 result[@enumToInt(Feature.mte)] = .{
768 .index = @enumToInt(Feature.mte),
769 .name = @tagName(Feature.mte),
770647 .llvm_name = "mte",
771648 .description = "Enable Memory Tagging Extension",
772 .dependencies = featureSet(&[_]Feature{}),
649 .dependencies = sparseFeatureSet(&[_]Feature{}),
773650 };
774651 result[@enumToInt(Feature.neon)] = .{
775 .index = @enumToInt(Feature.neon),
776 .name = @tagName(Feature.neon),
777652 .llvm_name = "neon",
778653 .description = "Enable Advanced SIMD instructions",
779 .dependencies = featureSet(&[_]Feature{
654 .dependencies = sparseFeatureSet(&[_]Feature{
780655 .fp_armv8,
781656 }),
782657 };
783658 result[@enumToInt(Feature.no_neg_immediates)] = .{
784 .index = @enumToInt(Feature.no_neg_immediates),
785 .name = @tagName(Feature.no_neg_immediates),
786659 .llvm_name = "no-neg-immediates",
787660 .description = "Convert immediates and instructions to their negated or complemented equivalent when the immediate does not fit in the encoding.",
788 .dependencies = featureSet(&[_]Feature{}),
661 .dependencies = sparseFeatureSet(&[_]Feature{}),
789662 };
790663 result[@enumToInt(Feature.nv)] = .{
791 .index = @enumToInt(Feature.nv),
792 .name = @tagName(Feature.nv),
793664 .llvm_name = "nv",
794665 .description = "Enable v8.4-A Nested Virtualization Enchancement",
795 .dependencies = featureSet(&[_]Feature{}),
666 .dependencies = sparseFeatureSet(&[_]Feature{}),
796667 };
797668 result[@enumToInt(Feature.pa)] = .{
798 .index = @enumToInt(Feature.pa),
799 .name = @tagName(Feature.pa),
800669 .llvm_name = "pa",
801670 .description = "Enable v8.3-A Pointer Authentication enchancement",
802 .dependencies = featureSet(&[_]Feature{}),
671 .dependencies = sparseFeatureSet(&[_]Feature{}),
803672 };
804673 result[@enumToInt(Feature.pan)] = .{
805 .index = @enumToInt(Feature.pan),
806 .name = @tagName(Feature.pan),
807674 .llvm_name = "pan",
808675 .description = "Enables ARM v8.1 Privileged Access-Never extension",
809 .dependencies = featureSet(&[_]Feature{}),
676 .dependencies = sparseFeatureSet(&[_]Feature{}),
810677 };
811678 result[@enumToInt(Feature.pan_rwv)] = .{
812 .index = @enumToInt(Feature.pan_rwv),
813 .name = @tagName(Feature.pan_rwv),
814679 .llvm_name = "pan-rwv",
815680 .description = "Enable v8.2 PAN s1e1R and s1e1W Variants",
816 .dependencies = featureSet(&[_]Feature{
681 .dependencies = sparseFeatureSet(&[_]Feature{
817682 .pan,
818683 }),
819684 };
820685 result[@enumToInt(Feature.perfmon)] = .{
821 .index = @enumToInt(Feature.perfmon),
822 .name = @tagName(Feature.perfmon),
823686 .llvm_name = "perfmon",
824687 .description = "Enable ARMv8 PMUv3 Performance Monitors extension",
825 .dependencies = featureSet(&[_]Feature{}),
688 .dependencies = sparseFeatureSet(&[_]Feature{}),
826689 };
827690 result[@enumToInt(Feature.predictable_select_expensive)] = .{
828 .index = @enumToInt(Feature.predictable_select_expensive),
829 .name = @tagName(Feature.predictable_select_expensive),
830691 .llvm_name = "predictable-select-expensive",
831692 .description = "Prefer likely predicted branches over selects",
832 .dependencies = featureSet(&[_]Feature{}),
693 .dependencies = sparseFeatureSet(&[_]Feature{}),
833694 };
834695 result[@enumToInt(Feature.predres)] = .{
835 .index = @enumToInt(Feature.predres),
836 .name = @tagName(Feature.predres),
837696 .llvm_name = "predres",
838697 .description = "Enable v8.5a execution and data prediction invalidation instructions",
839 .dependencies = featureSet(&[_]Feature{}),
698 .dependencies = sparseFeatureSet(&[_]Feature{}),
840699 };
841700 result[@enumToInt(Feature.rand)] = .{
842 .index = @enumToInt(Feature.rand),
843 .name = @tagName(Feature.rand),
844701 .llvm_name = "rand",
845702 .description = "Enable Random Number generation instructions",
846 .dependencies = featureSet(&[_]Feature{}),
703 .dependencies = sparseFeatureSet(&[_]Feature{}),
847704 };
848705 result[@enumToInt(Feature.ras)] = .{
849 .index = @enumToInt(Feature.ras),
850 .name = @tagName(Feature.ras),
851706 .llvm_name = "ras",
852707 .description = "Enable ARMv8 Reliability, Availability and Serviceability Extensions",
853 .dependencies = featureSet(&[_]Feature{}),
708 .dependencies = sparseFeatureSet(&[_]Feature{}),
854709 };
855710 result[@enumToInt(Feature.rasv8_4)] = .{
856 .index = @enumToInt(Feature.rasv8_4),
857 .name = @tagName(Feature.rasv8_4),
858711 .llvm_name = "rasv8_4",
859712 .description = "Enable v8.4-A Reliability, Availability and Serviceability extension",
860 .dependencies = featureSet(&[_]Feature{
713 .dependencies = sparseFeatureSet(&[_]Feature{
861714 .ras,
862715 }),
863716 };
864717 result[@enumToInt(Feature.rcpc)] = .{
865 .index = @enumToInt(Feature.rcpc),
866 .name = @tagName(Feature.rcpc),
867718 .llvm_name = "rcpc",
868719 .description = "Enable support for RCPC extension",
869 .dependencies = featureSet(&[_]Feature{}),
720 .dependencies = sparseFeatureSet(&[_]Feature{}),
870721 };
871722 result[@enumToInt(Feature.rcpc_immo)] = .{
872 .index = @enumToInt(Feature.rcpc_immo),
873 .name = @tagName(Feature.rcpc_immo),
874723 .llvm_name = "rcpc-immo",
875724 .description = "Enable v8.4-A RCPC instructions with Immediate Offsets",
876 .dependencies = featureSet(&[_]Feature{
725 .dependencies = sparseFeatureSet(&[_]Feature{
877726 .rcpc,
878727 }),
879728 };
880729 result[@enumToInt(Feature.rdm)] = .{
881 .index = @enumToInt(Feature.rdm),
882 .name = @tagName(Feature.rdm),
883730 .llvm_name = "rdm",
884731 .description = "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions",
885 .dependencies = featureSet(&[_]Feature{}),
732 .dependencies = sparseFeatureSet(&[_]Feature{}),
886733 };
887734 result[@enumToInt(Feature.reserve_x1)] = .{
888 .index = @enumToInt(Feature.reserve_x1),
889 .name = @tagName(Feature.reserve_x1),
890735 .llvm_name = "reserve-x1",
891736 .description = "Reserve X1, making it unavailable as a GPR",
892 .dependencies = featureSet(&[_]Feature{}),
737 .dependencies = sparseFeatureSet(&[_]Feature{}),
893738 };
894739 result[@enumToInt(Feature.reserve_x10)] = .{
895 .index = @enumToInt(Feature.reserve_x10),
896 .name = @tagName(Feature.reserve_x10),
897740 .llvm_name = "reserve-x10",
898741 .description = "Reserve X10, making it unavailable as a GPR",
899 .dependencies = featureSet(&[_]Feature{}),
742 .dependencies = sparseFeatureSet(&[_]Feature{}),
900743 };
901744 result[@enumToInt(Feature.reserve_x11)] = .{
902 .index = @enumToInt(Feature.reserve_x11),
903 .name = @tagName(Feature.reserve_x11),
904745 .llvm_name = "reserve-x11",
905746 .description = "Reserve X11, making it unavailable as a GPR",
906 .dependencies = featureSet(&[_]Feature{}),
747 .dependencies = sparseFeatureSet(&[_]Feature{}),
907748 };
908749 result[@enumToInt(Feature.reserve_x12)] = .{
909 .index = @enumToInt(Feature.reserve_x12),
910 .name = @tagName(Feature.reserve_x12),
911750 .llvm_name = "reserve-x12",
912751 .description = "Reserve X12, making it unavailable as a GPR",
913 .dependencies = featureSet(&[_]Feature{}),
752 .dependencies = sparseFeatureSet(&[_]Feature{}),
914753 };
915754 result[@enumToInt(Feature.reserve_x13)] = .{
916 .index = @enumToInt(Feature.reserve_x13),
917 .name = @tagName(Feature.reserve_x13),
918755 .llvm_name = "reserve-x13",
919756 .description = "Reserve X13, making it unavailable as a GPR",
920 .dependencies = featureSet(&[_]Feature{}),
757 .dependencies = sparseFeatureSet(&[_]Feature{}),
921758 };
922759 result[@enumToInt(Feature.reserve_x14)] = .{
923 .index = @enumToInt(Feature.reserve_x14),
924 .name = @tagName(Feature.reserve_x14),
925760 .llvm_name = "reserve-x14",
926761 .description = "Reserve X14, making it unavailable as a GPR",
927 .dependencies = featureSet(&[_]Feature{}),
762 .dependencies = sparseFeatureSet(&[_]Feature{}),
928763 };
929764 result[@enumToInt(Feature.reserve_x15)] = .{
930 .index = @enumToInt(Feature.reserve_x15),
931 .name = @tagName(Feature.reserve_x15),
932765 .llvm_name = "reserve-x15",
933766 .description = "Reserve X15, making it unavailable as a GPR",
934 .dependencies = featureSet(&[_]Feature{}),
767 .dependencies = sparseFeatureSet(&[_]Feature{}),
935768 };
936769 result[@enumToInt(Feature.reserve_x18)] = .{
937 .index = @enumToInt(Feature.reserve_x18),
938 .name = @tagName(Feature.reserve_x18),
939770 .llvm_name = "reserve-x18",
940771 .description = "Reserve X18, making it unavailable as a GPR",
941 .dependencies = featureSet(&[_]Feature{}),
772 .dependencies = sparseFeatureSet(&[_]Feature{}),
942773 };
943774 result[@enumToInt(Feature.reserve_x2)] = .{
944 .index = @enumToInt(Feature.reserve_x2),
945 .name = @tagName(Feature.reserve_x2),
946775 .llvm_name = "reserve-x2",
947776 .description = "Reserve X2, making it unavailable as a GPR",
948 .dependencies = featureSet(&[_]Feature{}),
777 .dependencies = sparseFeatureSet(&[_]Feature{}),
949778 };
950779 result[@enumToInt(Feature.reserve_x20)] = .{
951 .index = @enumToInt(Feature.reserve_x20),
952 .name = @tagName(Feature.reserve_x20),
953780 .llvm_name = "reserve-x20",
954781 .description = "Reserve X20, making it unavailable as a GPR",
955 .dependencies = featureSet(&[_]Feature{}),
782 .dependencies = sparseFeatureSet(&[_]Feature{}),
956783 };
957784 result[@enumToInt(Feature.reserve_x21)] = .{
958 .index = @enumToInt(Feature.reserve_x21),
959 .name = @tagName(Feature.reserve_x21),
960785 .llvm_name = "reserve-x21",
961786 .description = "Reserve X21, making it unavailable as a GPR",
962 .dependencies = featureSet(&[_]Feature{}),
787 .dependencies = sparseFeatureSet(&[_]Feature{}),
963788 };
964789 result[@enumToInt(Feature.reserve_x22)] = .{
965 .index = @enumToInt(Feature.reserve_x22),
966 .name = @tagName(Feature.reserve_x22),
967790 .llvm_name = "reserve-x22",
968791 .description = "Reserve X22, making it unavailable as a GPR",
969 .dependencies = featureSet(&[_]Feature{}),
792 .dependencies = sparseFeatureSet(&[_]Feature{}),
970793 };
971794 result[@enumToInt(Feature.reserve_x23)] = .{
972 .index = @enumToInt(Feature.reserve_x23),
973 .name = @tagName(Feature.reserve_x23),
974795 .llvm_name = "reserve-x23",
975796 .description = "Reserve X23, making it unavailable as a GPR",
976 .dependencies = featureSet(&[_]Feature{}),
797 .dependencies = sparseFeatureSet(&[_]Feature{}),
977798 };
978799 result[@enumToInt(Feature.reserve_x24)] = .{
979 .index = @enumToInt(Feature.reserve_x24),
980 .name = @tagName(Feature.reserve_x24),
981800 .llvm_name = "reserve-x24",
982801 .description = "Reserve X24, making it unavailable as a GPR",
983 .dependencies = featureSet(&[_]Feature{}),
802 .dependencies = sparseFeatureSet(&[_]Feature{}),
984803 };
985804 result[@enumToInt(Feature.reserve_x25)] = .{
986 .index = @enumToInt(Feature.reserve_x25),
987 .name = @tagName(Feature.reserve_x25),
988805 .llvm_name = "reserve-x25",
989806 .description = "Reserve X25, making it unavailable as a GPR",
990 .dependencies = featureSet(&[_]Feature{}),
807 .dependencies = sparseFeatureSet(&[_]Feature{}),
991808 };
992809 result[@enumToInt(Feature.reserve_x26)] = .{
993 .index = @enumToInt(Feature.reserve_x26),
994 .name = @tagName(Feature.reserve_x26),
995810 .llvm_name = "reserve-x26",
996811 .description = "Reserve X26, making it unavailable as a GPR",
997 .dependencies = featureSet(&[_]Feature{}),
812 .dependencies = sparseFeatureSet(&[_]Feature{}),
998813 };
999814 result[@enumToInt(Feature.reserve_x27)] = .{
1000 .index = @enumToInt(Feature.reserve_x27),
1001 .name = @tagName(Feature.reserve_x27),
1002815 .llvm_name = "reserve-x27",
1003816 .description = "Reserve X27, making it unavailable as a GPR",
1004 .dependencies = featureSet(&[_]Feature{}),
817 .dependencies = sparseFeatureSet(&[_]Feature{}),
1005818 };
1006819 result[@enumToInt(Feature.reserve_x28)] = .{
1007 .index = @enumToInt(Feature.reserve_x28),
1008 .name = @tagName(Feature.reserve_x28),
1009820 .llvm_name = "reserve-x28",
1010821 .description = "Reserve X28, making it unavailable as a GPR",
1011 .dependencies = featureSet(&[_]Feature{}),
822 .dependencies = sparseFeatureSet(&[_]Feature{}),
1012823 };
1013824 result[@enumToInt(Feature.reserve_x3)] = .{
1014 .index = @enumToInt(Feature.reserve_x3),
1015 .name = @tagName(Feature.reserve_x3),
1016825 .llvm_name = "reserve-x3",
1017826 .description = "Reserve X3, making it unavailable as a GPR",
1018 .dependencies = featureSet(&[_]Feature{}),
827 .dependencies = sparseFeatureSet(&[_]Feature{}),
1019828 };
1020829 result[@enumToInt(Feature.reserve_x4)] = .{
1021 .index = @enumToInt(Feature.reserve_x4),
1022 .name = @tagName(Feature.reserve_x4),
1023830 .llvm_name = "reserve-x4",
1024831 .description = "Reserve X4, making it unavailable as a GPR",
1025 .dependencies = featureSet(&[_]Feature{}),
832 .dependencies = sparseFeatureSet(&[_]Feature{}),
1026833 };
1027834 result[@enumToInt(Feature.reserve_x5)] = .{
1028 .index = @enumToInt(Feature.reserve_x5),
1029 .name = @tagName(Feature.reserve_x5),
1030835 .llvm_name = "reserve-x5",
1031836 .description = "Reserve X5, making it unavailable as a GPR",
1032 .dependencies = featureSet(&[_]Feature{}),
837 .dependencies = sparseFeatureSet(&[_]Feature{}),
1033838 };
1034839 result[@enumToInt(Feature.reserve_x6)] = .{
1035 .index = @enumToInt(Feature.reserve_x6),
1036 .name = @tagName(Feature.reserve_x6),
1037840 .llvm_name = "reserve-x6",
1038841 .description = "Reserve X6, making it unavailable as a GPR",
1039 .dependencies = featureSet(&[_]Feature{}),
842 .dependencies = sparseFeatureSet(&[_]Feature{}),
1040843 };
1041844 result[@enumToInt(Feature.reserve_x7)] = .{
1042 .index = @enumToInt(Feature.reserve_x7),
1043 .name = @tagName(Feature.reserve_x7),
1044845 .llvm_name = "reserve-x7",
1045846 .description = "Reserve X7, making it unavailable as a GPR",
1046 .dependencies = featureSet(&[_]Feature{}),
847 .dependencies = sparseFeatureSet(&[_]Feature{}),
1047848 };
1048849 result[@enumToInt(Feature.reserve_x9)] = .{
1049 .index = @enumToInt(Feature.reserve_x9),
1050 .name = @tagName(Feature.reserve_x9),
1051850 .llvm_name = "reserve-x9",
1052851 .description = "Reserve X9, making it unavailable as a GPR",
1053 .dependencies = featureSet(&[_]Feature{}),
852 .dependencies = sparseFeatureSet(&[_]Feature{}),
1054853 };
1055854 result[@enumToInt(Feature.saphira)] = .{
1056 .index = @enumToInt(Feature.saphira),
1057 .name = @tagName(Feature.saphira),
1058855 .llvm_name = "saphira",
1059856 .description = "Qualcomm Saphira processors",
1060 .dependencies = featureSet(&[_]Feature{
857 .dependencies = sparseFeatureSet(&[_]Feature{
1061858 .crypto,
1062859 .custom_cheap_as_move,
1063860 .fp_armv8,
......@@ -1072,157 +869,119 @@ pub const all_features = blk: {
1072869 }),
1073870 };
1074871 result[@enumToInt(Feature.sb)] = .{
1075 .index = @enumToInt(Feature.sb),
1076 .name = @tagName(Feature.sb),
1077872 .llvm_name = "sb",
1078873 .description = "Enable v8.5 Speculation Barrier",
1079 .dependencies = featureSet(&[_]Feature{}),
874 .dependencies = sparseFeatureSet(&[_]Feature{}),
1080875 };
1081876 result[@enumToInt(Feature.sel2)] = .{
1082 .index = @enumToInt(Feature.sel2),
1083 .name = @tagName(Feature.sel2),
1084877 .llvm_name = "sel2",
1085878 .description = "Enable v8.4-A Secure Exception Level 2 extension",
1086 .dependencies = featureSet(&[_]Feature{}),
879 .dependencies = sparseFeatureSet(&[_]Feature{}),
1087880 };
1088881 result[@enumToInt(Feature.sha2)] = .{
1089 .index = @enumToInt(Feature.sha2),
1090 .name = @tagName(Feature.sha2),
1091882 .llvm_name = "sha2",
1092883 .description = "Enable SHA1 and SHA256 support",
1093 .dependencies = featureSet(&[_]Feature{
884 .dependencies = sparseFeatureSet(&[_]Feature{
1094885 .neon,
1095886 }),
1096887 };
1097888 result[@enumToInt(Feature.sha3)] = .{
1098 .index = @enumToInt(Feature.sha3),
1099 .name = @tagName(Feature.sha3),
1100889 .llvm_name = "sha3",
1101890 .description = "Enable SHA512 and SHA3 support",
1102 .dependencies = featureSet(&[_]Feature{
891 .dependencies = sparseFeatureSet(&[_]Feature{
1103892 .neon,
1104893 .sha2,
1105894 }),
1106895 };
1107896 result[@enumToInt(Feature.slow_misaligned_128store)] = .{
1108 .index = @enumToInt(Feature.slow_misaligned_128store),
1109 .name = @tagName(Feature.slow_misaligned_128store),
1110897 .llvm_name = "slow-misaligned-128store",
1111898 .description = "Misaligned 128 bit stores are slow",
1112 .dependencies = featureSet(&[_]Feature{}),
899 .dependencies = sparseFeatureSet(&[_]Feature{}),
1113900 };
1114901 result[@enumToInt(Feature.slow_paired_128)] = .{
1115 .index = @enumToInt(Feature.slow_paired_128),
1116 .name = @tagName(Feature.slow_paired_128),
1117902 .llvm_name = "slow-paired-128",
1118903 .description = "Paired 128 bit loads and stores are slow",
1119 .dependencies = featureSet(&[_]Feature{}),
904 .dependencies = sparseFeatureSet(&[_]Feature{}),
1120905 };
1121906 result[@enumToInt(Feature.slow_strqro_store)] = .{
1122 .index = @enumToInt(Feature.slow_strqro_store),
1123 .name = @tagName(Feature.slow_strqro_store),
1124907 .llvm_name = "slow-strqro-store",
1125908 .description = "STR of Q register with register offset is slow",
1126 .dependencies = featureSet(&[_]Feature{}),
909 .dependencies = sparseFeatureSet(&[_]Feature{}),
1127910 };
1128911 result[@enumToInt(Feature.sm4)] = .{
1129 .index = @enumToInt(Feature.sm4),
1130 .name = @tagName(Feature.sm4),
1131912 .llvm_name = "sm4",
1132913 .description = "Enable SM3 and SM4 support",
1133 .dependencies = featureSet(&[_]Feature{
914 .dependencies = sparseFeatureSet(&[_]Feature{
1134915 .neon,
1135916 }),
1136917 };
1137918 result[@enumToInt(Feature.spe)] = .{
1138 .index = @enumToInt(Feature.spe),
1139 .name = @tagName(Feature.spe),
1140919 .llvm_name = "spe",
1141920 .description = "Enable Statistical Profiling extension",
1142 .dependencies = featureSet(&[_]Feature{}),
921 .dependencies = sparseFeatureSet(&[_]Feature{}),
1143922 };
1144923 result[@enumToInt(Feature.specrestrict)] = .{
1145 .index = @enumToInt(Feature.specrestrict),
1146 .name = @tagName(Feature.specrestrict),
1147924 .llvm_name = "specrestrict",
1148925 .description = "Enable architectural speculation restriction",
1149 .dependencies = featureSet(&[_]Feature{}),
926 .dependencies = sparseFeatureSet(&[_]Feature{}),
1150927 };
1151928 result[@enumToInt(Feature.ssbs)] = .{
1152 .index = @enumToInt(Feature.ssbs),
1153 .name = @tagName(Feature.ssbs),
1154929 .llvm_name = "ssbs",
1155930 .description = "Enable Speculative Store Bypass Safe bit",
1156 .dependencies = featureSet(&[_]Feature{}),
931 .dependencies = sparseFeatureSet(&[_]Feature{}),
1157932 };
1158933 result[@enumToInt(Feature.strict_align)] = .{
1159 .index = @enumToInt(Feature.strict_align),
1160 .name = @tagName(Feature.strict_align),
1161934 .llvm_name = "strict-align",
1162935 .description = "Disallow all unaligned memory access",
1163 .dependencies = featureSet(&[_]Feature{}),
936 .dependencies = sparseFeatureSet(&[_]Feature{}),
1164937 };
1165938 result[@enumToInt(Feature.sve)] = .{
1166 .index = @enumToInt(Feature.sve),
1167 .name = @tagName(Feature.sve),
1168939 .llvm_name = "sve",
1169940 .description = "Enable Scalable Vector Extension (SVE) instructions",
1170 .dependencies = featureSet(&[_]Feature{}),
941 .dependencies = sparseFeatureSet(&[_]Feature{}),
1171942 };
1172943 result[@enumToInt(Feature.sve2)] = .{
1173 .index = @enumToInt(Feature.sve2),
1174 .name = @tagName(Feature.sve2),
1175944 .llvm_name = "sve2",
1176945 .description = "Enable Scalable Vector Extension 2 (SVE2) instructions",
1177 .dependencies = featureSet(&[_]Feature{
946 .dependencies = sparseFeatureSet(&[_]Feature{
1178947 .sve,
1179948 }),
1180949 };
1181950 result[@enumToInt(Feature.sve2_aes)] = .{
1182 .index = @enumToInt(Feature.sve2_aes),
1183 .name = @tagName(Feature.sve2_aes),
1184951 .llvm_name = "sve2-aes",
1185952 .description = "Enable AES SVE2 instructions",
1186 .dependencies = featureSet(&[_]Feature{
953 .dependencies = sparseFeatureSet(&[_]Feature{
1187954 .aes,
1188955 .sve2,
1189956 }),
1190957 };
1191958 result[@enumToInt(Feature.sve2_bitperm)] = .{
1192 .index = @enumToInt(Feature.sve2_bitperm),
1193 .name = @tagName(Feature.sve2_bitperm),
1194959 .llvm_name = "sve2-bitperm",
1195960 .description = "Enable bit permutation SVE2 instructions",
1196 .dependencies = featureSet(&[_]Feature{
961 .dependencies = sparseFeatureSet(&[_]Feature{
1197962 .sve2,
1198963 }),
1199964 };
1200965 result[@enumToInt(Feature.sve2_sha3)] = .{
1201 .index = @enumToInt(Feature.sve2_sha3),
1202 .name = @tagName(Feature.sve2_sha3),
1203966 .llvm_name = "sve2-sha3",
1204967 .description = "Enable SHA3 SVE2 instructions",
1205 .dependencies = featureSet(&[_]Feature{
968 .dependencies = sparseFeatureSet(&[_]Feature{
1206969 .sha3,
1207970 .sve2,
1208971 }),
1209972 };
1210973 result[@enumToInt(Feature.sve2_sm4)] = .{
1211 .index = @enumToInt(Feature.sve2_sm4),
1212 .name = @tagName(Feature.sve2_sm4),
1213974 .llvm_name = "sve2-sm4",
1214975 .description = "Enable SM4 SVE2 instructions",
1215 .dependencies = featureSet(&[_]Feature{
976 .dependencies = sparseFeatureSet(&[_]Feature{
1216977 .sm4,
1217978 .sve2,
1218979 }),
1219980 };
1220981 result[@enumToInt(Feature.thunderx)] = .{
1221 .index = @enumToInt(Feature.thunderx),
1222 .name = @tagName(Feature.thunderx),
1223982 .llvm_name = "thunderx",
1224983 .description = "Cavium ThunderX processors",
1225 .dependencies = featureSet(&[_]Feature{
984 .dependencies = sparseFeatureSet(&[_]Feature{
1226985 .crc,
1227986 .crypto,
1228987 .fp_armv8,
......@@ -1233,11 +992,9 @@ pub const all_features = blk: {
1233992 }),
1234993 };
1235994 result[@enumToInt(Feature.thunderx2t99)] = .{
1236 .index = @enumToInt(Feature.thunderx2t99),
1237 .name = @tagName(Feature.thunderx2t99),
1238995 .llvm_name = "thunderx2t99",
1239996 .description = "Cavium ThunderX2 processors",
1240 .dependencies = featureSet(&[_]Feature{
997 .dependencies = sparseFeatureSet(&[_]Feature{
1241998 .aggressive_fma,
1242999 .arith_bcc_fusion,
12431000 .crc,
......@@ -1251,11 +1008,9 @@ pub const all_features = blk: {
12511008 }),
12521009 };
12531010 result[@enumToInt(Feature.thunderxt81)] = .{
1254 .index = @enumToInt(Feature.thunderxt81),
1255 .name = @tagName(Feature.thunderxt81),
12561011 .llvm_name = "thunderxt81",
12571012 .description = "Cavium ThunderX processors",
1258 .dependencies = featureSet(&[_]Feature{
1013 .dependencies = sparseFeatureSet(&[_]Feature{
12591014 .crc,
12601015 .crypto,
12611016 .fp_armv8,
......@@ -1266,11 +1021,9 @@ pub const all_features = blk: {
12661021 }),
12671022 };
12681023 result[@enumToInt(Feature.thunderxt83)] = .{
1269 .index = @enumToInt(Feature.thunderxt83),
1270 .name = @tagName(Feature.thunderxt83),
12711024 .llvm_name = "thunderxt83",
12721025 .description = "Cavium ThunderX processors",
1273 .dependencies = featureSet(&[_]Feature{
1026 .dependencies = sparseFeatureSet(&[_]Feature{
12741027 .crc,
12751028 .crypto,
12761029 .fp_armv8,
......@@ -1281,11 +1034,9 @@ pub const all_features = blk: {
12811034 }),
12821035 };
12831036 result[@enumToInt(Feature.thunderxt88)] = .{
1284 .index = @enumToInt(Feature.thunderxt88),
1285 .name = @tagName(Feature.thunderxt88),
12861037 .llvm_name = "thunderxt88",
12871038 .description = "Cavium ThunderX processors",
1288 .dependencies = featureSet(&[_]Feature{
1039 .dependencies = sparseFeatureSet(&[_]Feature{
12891040 .crc,
12901041 .crypto,
12911042 .fp_armv8,
......@@ -1296,46 +1047,34 @@ pub const all_features = blk: {
12961047 }),
12971048 };
12981049 result[@enumToInt(Feature.tlb_rmi)] = .{
1299 .index = @enumToInt(Feature.tlb_rmi),
1300 .name = @tagName(Feature.tlb_rmi),
13011050 .llvm_name = "tlb-rmi",
13021051 .description = "Enable v8.4-A TLB Range and Maintenance Instructions",
1303 .dependencies = featureSet(&[_]Feature{}),
1052 .dependencies = sparseFeatureSet(&[_]Feature{}),
13041053 };
13051054 result[@enumToInt(Feature.tpidr_el1)] = .{
1306 .index = @enumToInt(Feature.tpidr_el1),
1307 .name = @tagName(Feature.tpidr_el1),
13081055 .llvm_name = "tpidr-el1",
13091056 .description = "Permit use of TPIDR_EL1 for the TLS base",
1310 .dependencies = featureSet(&[_]Feature{}),
1057 .dependencies = sparseFeatureSet(&[_]Feature{}),
13111058 };
13121059 result[@enumToInt(Feature.tpidr_el2)] = .{
1313 .index = @enumToInt(Feature.tpidr_el2),
1314 .name = @tagName(Feature.tpidr_el2),
13151060 .llvm_name = "tpidr-el2",
13161061 .description = "Permit use of TPIDR_EL2 for the TLS base",
1317 .dependencies = featureSet(&[_]Feature{}),
1062 .dependencies = sparseFeatureSet(&[_]Feature{}),
13181063 };
13191064 result[@enumToInt(Feature.tpidr_el3)] = .{
1320 .index = @enumToInt(Feature.tpidr_el3),
1321 .name = @tagName(Feature.tpidr_el3),
13221065 .llvm_name = "tpidr-el3",
13231066 .description = "Permit use of TPIDR_EL3 for the TLS base",
1324 .dependencies = featureSet(&[_]Feature{}),
1067 .dependencies = sparseFeatureSet(&[_]Feature{}),
13251068 };
13261069 result[@enumToInt(Feature.tracev8_4)] = .{
1327 .index = @enumToInt(Feature.tracev8_4),
1328 .name = @tagName(Feature.tracev8_4),
13291070 .llvm_name = "tracev8.4",
13301071 .description = "Enable v8.4-A Trace extension",
1331 .dependencies = featureSet(&[_]Feature{}),
1072 .dependencies = sparseFeatureSet(&[_]Feature{}),
13321073 };
13331074 result[@enumToInt(Feature.tsv110)] = .{
1334 .index = @enumToInt(Feature.tsv110),
1335 .name = @tagName(Feature.tsv110),
13361075 .llvm_name = "tsv110",
13371076 .description = "HiSilicon TS-V110 processors",
1338 .dependencies = featureSet(&[_]Feature{
1077 .dependencies = sparseFeatureSet(&[_]Feature{
13391078 .crypto,
13401079 .custom_cheap_as_move,
13411080 .dotprod,
......@@ -1351,39 +1090,29 @@ pub const all_features = blk: {
13511090 }),
13521091 };
13531092 result[@enumToInt(Feature.uaops)] = .{
1354 .index = @enumToInt(Feature.uaops),
1355 .name = @tagName(Feature.uaops),
13561093 .llvm_name = "uaops",
13571094 .description = "Enable v8.2 UAO PState",
1358 .dependencies = featureSet(&[_]Feature{}),
1095 .dependencies = sparseFeatureSet(&[_]Feature{}),
13591096 };
13601097 result[@enumToInt(Feature.use_aa)] = .{
1361 .index = @enumToInt(Feature.use_aa),
1362 .name = @tagName(Feature.use_aa),
13631098 .llvm_name = "use-aa",
13641099 .description = "Use alias analysis during codegen",
1365 .dependencies = featureSet(&[_]Feature{}),
1100 .dependencies = sparseFeatureSet(&[_]Feature{}),
13661101 };
13671102 result[@enumToInt(Feature.use_postra_scheduler)] = .{
1368 .index = @enumToInt(Feature.use_postra_scheduler),
1369 .name = @tagName(Feature.use_postra_scheduler),
13701103 .llvm_name = "use-postra-scheduler",
13711104 .description = "Schedule again after register allocation",
1372 .dependencies = featureSet(&[_]Feature{}),
1105 .dependencies = sparseFeatureSet(&[_]Feature{}),
13731106 };
13741107 result[@enumToInt(Feature.use_reciprocal_square_root)] = .{
1375 .index = @enumToInt(Feature.use_reciprocal_square_root),
1376 .name = @tagName(Feature.use_reciprocal_square_root),
13771108 .llvm_name = "use-reciprocal-square-root",
13781109 .description = "Use the reciprocal square root approximation",
1379 .dependencies = featureSet(&[_]Feature{}),
1110 .dependencies = sparseFeatureSet(&[_]Feature{}),
13801111 };
13811112 result[@enumToInt(Feature.v8_1a)] = .{
1382 .index = @enumToInt(Feature.v8_1a),
1383 .name = @tagName(Feature.v8_1a),
13841113 .llvm_name = "v8.1a",
13851114 .description = "Support ARM v8.1a instructions",
1386 .dependencies = featureSet(&[_]Feature{
1115 .dependencies = sparseFeatureSet(&[_]Feature{
13871116 .crc,
13881117 .lor,
13891118 .lse,
......@@ -1393,11 +1122,9 @@ pub const all_features = blk: {
13931122 }),
13941123 };
13951124 result[@enumToInt(Feature.v8_2a)] = .{
1396 .index = @enumToInt(Feature.v8_2a),
1397 .name = @tagName(Feature.v8_2a),
13981125 .llvm_name = "v8.2a",
13991126 .description = "Support ARM v8.2a instructions",
1400 .dependencies = featureSet(&[_]Feature{
1127 .dependencies = sparseFeatureSet(&[_]Feature{
14011128 .ccpp,
14021129 .pan_rwv,
14031130 .ras,
......@@ -1406,11 +1133,9 @@ pub const all_features = blk: {
14061133 }),
14071134 };
14081135 result[@enumToInt(Feature.v8_3a)] = .{
1409 .index = @enumToInt(Feature.v8_3a),
1410 .name = @tagName(Feature.v8_3a),
14111136 .llvm_name = "v8.3a",
14121137 .description = "Support ARM v8.3a instructions",
1413 .dependencies = featureSet(&[_]Feature{
1138 .dependencies = sparseFeatureSet(&[_]Feature{
14141139 .ccidx,
14151140 .complxnum,
14161141 .jsconv,
......@@ -1420,11 +1145,9 @@ pub const all_features = blk: {
14201145 }),
14211146 };
14221147 result[@enumToInt(Feature.v8_4a)] = .{
1423 .index = @enumToInt(Feature.v8_4a),
1424 .name = @tagName(Feature.v8_4a),
14251148 .llvm_name = "v8.4a",
14261149 .description = "Support ARM v8.4a instructions",
1427 .dependencies = featureSet(&[_]Feature{
1150 .dependencies = sparseFeatureSet(&[_]Feature{
14281151 .am,
14291152 .dit,
14301153 .dotprod,
......@@ -1440,11 +1163,9 @@ pub const all_features = blk: {
14401163 }),
14411164 };
14421165 result[@enumToInt(Feature.v8_5a)] = .{
1443 .index = @enumToInt(Feature.v8_5a),
1444 .name = @tagName(Feature.v8_5a),
14451166 .llvm_name = "v8.5a",
14461167 .description = "Support ARM v8.5a instructions",
1447 .dependencies = featureSet(&[_]Feature{
1168 .dependencies = sparseFeatureSet(&[_]Feature{
14481169 .altnzcv,
14491170 .bti,
14501171 .ccdp,
......@@ -1457,50 +1178,44 @@ pub const all_features = blk: {
14571178 }),
14581179 };
14591180 result[@enumToInt(Feature.vh)] = .{
1460 .index = @enumToInt(Feature.vh),
1461 .name = @tagName(Feature.vh),
14621181 .llvm_name = "vh",
14631182 .description = "Enables ARM v8.1 Virtual Host extension",
1464 .dependencies = featureSet(&[_]Feature{}),
1183 .dependencies = sparseFeatureSet(&[_]Feature{}),
14651184 };
14661185 result[@enumToInt(Feature.zcm)] = .{
1467 .index = @enumToInt(Feature.zcm),
1468 .name = @tagName(Feature.zcm),
14691186 .llvm_name = "zcm",
14701187 .description = "Has zero-cycle register moves",
1471 .dependencies = featureSet(&[_]Feature{}),
1188 .dependencies = sparseFeatureSet(&[_]Feature{}),
14721189 };
14731190 result[@enumToInt(Feature.zcz)] = .{
1474 .index = @enumToInt(Feature.zcz),
1475 .name = @tagName(Feature.zcz),
14761191 .llvm_name = "zcz",
14771192 .description = "Has zero-cycle zeroing instructions",
1478 .dependencies = featureSet(&[_]Feature{
1193 .dependencies = sparseFeatureSet(&[_]Feature{
14791194 .zcz_fp,
14801195 .zcz_gp,
14811196 }),
14821197 };
14831198 result[@enumToInt(Feature.zcz_fp)] = .{
1484 .index = @enumToInt(Feature.zcz_fp),
1485 .name = @tagName(Feature.zcz_fp),
14861199 .llvm_name = "zcz-fp",
14871200 .description = "Has zero-cycle zeroing instructions for FP registers",
1488 .dependencies = featureSet(&[_]Feature{}),
1201 .dependencies = sparseFeatureSet(&[_]Feature{}),
14891202 };
14901203 result[@enumToInt(Feature.zcz_fp_workaround)] = .{
1491 .index = @enumToInt(Feature.zcz_fp_workaround),
1492 .name = @tagName(Feature.zcz_fp_workaround),
14931204 .llvm_name = "zcz-fp-workaround",
14941205 .description = "The zero-cycle floating-point zeroing instruction has a bug",
1495 .dependencies = featureSet(&[_]Feature{}),
1206 .dependencies = sparseFeatureSet(&[_]Feature{}),
14961207 };
14971208 result[@enumToInt(Feature.zcz_gp)] = .{
1498 .index = @enumToInt(Feature.zcz_gp),
1499 .name = @tagName(Feature.zcz_gp),
15001209 .llvm_name = "zcz-gp",
15011210 .description = "Has zero-cycle zeroing instructions for generic registers",
1502 .dependencies = featureSet(&[_]Feature{}),
1503 };
1211 .dependencies = sparseFeatureSet(&[_]Feature{}),
1212 };
1213 const ti = @typeInfo(Feature);
1214 for (result) |*elem, i| {
1215 elem.index = i;
1216 elem.name = ti.Enum.fields[i].name;
1217 elem.dependencies.initAsDependencies(i, &result);
1218 }
15041219 break :blk result;
15051220};
15061221
......@@ -1508,126 +1223,126 @@ pub const cpu = struct {
15081223 pub const apple_latest = Cpu{
15091224 .name = "apple_latest",
15101225 .llvm_name = "apple-latest",
1511 .features = featureSet(&[_]Feature{
1226 .features = featureSet(&all_features, &[_]Feature{
15121227 .cyclone,
15131228 }),
15141229 };
15151230 pub const cortex_a35 = Cpu{
15161231 .name = "cortex_a35",
15171232 .llvm_name = "cortex-a35",
1518 .features = featureSet(&[_]Feature{
1233 .features = featureSet(&all_features, &[_]Feature{
15191234 .a35,
15201235 }),
15211236 };
15221237 pub const cortex_a53 = Cpu{
15231238 .name = "cortex_a53",
15241239 .llvm_name = "cortex-a53",
1525 .features = featureSet(&[_]Feature{
1240 .features = featureSet(&all_features, &[_]Feature{
15261241 .a53,
15271242 }),
15281243 };
15291244 pub const cortex_a55 = Cpu{
15301245 .name = "cortex_a55",
15311246 .llvm_name = "cortex-a55",
1532 .features = featureSet(&[_]Feature{
1247 .features = featureSet(&all_features, &[_]Feature{
15331248 .a55,
15341249 }),
15351250 };
15361251 pub const cortex_a57 = Cpu{
15371252 .name = "cortex_a57",
15381253 .llvm_name = "cortex-a57",
1539 .features = featureSet(&[_]Feature{
1254 .features = featureSet(&all_features, &[_]Feature{
15401255 .a57,
15411256 }),
15421257 };
15431258 pub const cortex_a72 = Cpu{
15441259 .name = "cortex_a72",
15451260 .llvm_name = "cortex-a72",
1546 .features = featureSet(&[_]Feature{
1261 .features = featureSet(&all_features, &[_]Feature{
15471262 .a72,
15481263 }),
15491264 };
15501265 pub const cortex_a73 = Cpu{
15511266 .name = "cortex_a73",
15521267 .llvm_name = "cortex-a73",
1553 .features = featureSet(&[_]Feature{
1268 .features = featureSet(&all_features, &[_]Feature{
15541269 .a73,
15551270 }),
15561271 };
15571272 pub const cortex_a75 = Cpu{
15581273 .name = "cortex_a75",
15591274 .llvm_name = "cortex-a75",
1560 .features = featureSet(&[_]Feature{
1275 .features = featureSet(&all_features, &[_]Feature{
15611276 .a75,
15621277 }),
15631278 };
15641279 pub const cortex_a76 = Cpu{
15651280 .name = "cortex_a76",
15661281 .llvm_name = "cortex-a76",
1567 .features = featureSet(&[_]Feature{
1282 .features = featureSet(&all_features, &[_]Feature{
15681283 .a76,
15691284 }),
15701285 };
15711286 pub const cortex_a76ae = Cpu{
15721287 .name = "cortex_a76ae",
15731288 .llvm_name = "cortex-a76ae",
1574 .features = featureSet(&[_]Feature{
1289 .features = featureSet(&all_features, &[_]Feature{
15751290 .a76,
15761291 }),
15771292 };
15781293 pub const cyclone = Cpu{
15791294 .name = "cyclone",
15801295 .llvm_name = "cyclone",
1581 .features = featureSet(&[_]Feature{
1296 .features = featureSet(&all_features, &[_]Feature{
15821297 .cyclone,
15831298 }),
15841299 };
15851300 pub const exynos_m1 = Cpu{
15861301 .name = "exynos_m1",
15871302 .llvm_name = "exynos-m1",
1588 .features = featureSet(&[_]Feature{
1303 .features = featureSet(&all_features, &[_]Feature{
15891304 .exynosm1,
15901305 }),
15911306 };
15921307 pub const exynos_m2 = Cpu{
15931308 .name = "exynos_m2",
15941309 .llvm_name = "exynos-m2",
1595 .features = featureSet(&[_]Feature{
1310 .features = featureSet(&all_features, &[_]Feature{
15961311 .exynosm2,
15971312 }),
15981313 };
15991314 pub const exynos_m3 = Cpu{
16001315 .name = "exynos_m3",
16011316 .llvm_name = "exynos-m3",
1602 .features = featureSet(&[_]Feature{
1317 .features = featureSet(&all_features, &[_]Feature{
16031318 .exynosm3,
16041319 }),
16051320 };
16061321 pub const exynos_m4 = Cpu{
16071322 .name = "exynos_m4",
16081323 .llvm_name = "exynos-m4",
1609 .features = featureSet(&[_]Feature{
1324 .features = featureSet(&all_features, &[_]Feature{
16101325 .exynosm4,
16111326 }),
16121327 };
16131328 pub const exynos_m5 = Cpu{
16141329 .name = "exynos_m5",
16151330 .llvm_name = "exynos-m5",
1616 .features = featureSet(&[_]Feature{
1331 .features = featureSet(&all_features, &[_]Feature{
16171332 .exynosm4,
16181333 }),
16191334 };
16201335 pub const falkor = Cpu{
16211336 .name = "falkor",
16221337 .llvm_name = "falkor",
1623 .features = featureSet(&[_]Feature{
1338 .features = featureSet(&all_features, &[_]Feature{
16241339 .falkor,
16251340 }),
16261341 };
16271342 pub const generic = Cpu{
16281343 .name = "generic",
16291344 .llvm_name = "generic",
1630 .features = featureSet(&[_]Feature{
1345 .features = featureSet(&all_features, &[_]Feature{
16311346 .fp_armv8,
16321347 .fuse_aes,
16331348 .neon,
......@@ -1638,56 +1353,56 @@ pub const cpu = struct {
16381353 pub const kryo = Cpu{
16391354 .name = "kryo",
16401355 .llvm_name = "kryo",
1641 .features = featureSet(&[_]Feature{
1356 .features = featureSet(&all_features, &[_]Feature{
16421357 .kryo,
16431358 }),
16441359 };
16451360 pub const saphira = Cpu{
16461361 .name = "saphira",
16471362 .llvm_name = "saphira",
1648 .features = featureSet(&[_]Feature{
1363 .features = featureSet(&all_features, &[_]Feature{
16491364 .saphira,
16501365 }),
16511366 };
16521367 pub const thunderx = Cpu{
16531368 .name = "thunderx",
16541369 .llvm_name = "thunderx",
1655 .features = featureSet(&[_]Feature{
1370 .features = featureSet(&all_features, &[_]Feature{
16561371 .thunderx,
16571372 }),
16581373 };
16591374 pub const thunderx2t99 = Cpu{
16601375 .name = "thunderx2t99",
16611376 .llvm_name = "thunderx2t99",
1662 .features = featureSet(&[_]Feature{
1377 .features = featureSet(&all_features, &[_]Feature{
16631378 .thunderx2t99,
16641379 }),
16651380 };
16661381 pub const thunderxt81 = Cpu{
16671382 .name = "thunderxt81",
16681383 .llvm_name = "thunderxt81",
1669 .features = featureSet(&[_]Feature{
1384 .features = featureSet(&all_features, &[_]Feature{
16701385 .thunderxt81,
16711386 }),
16721387 };
16731388 pub const thunderxt83 = Cpu{
16741389 .name = "thunderxt83",
16751390 .llvm_name = "thunderxt83",
1676 .features = featureSet(&[_]Feature{
1391 .features = featureSet(&all_features, &[_]Feature{
16771392 .thunderxt83,
16781393 }),
16791394 };
16801395 pub const thunderxt88 = Cpu{
16811396 .name = "thunderxt88",
16821397 .llvm_name = "thunderxt88",
1683 .features = featureSet(&[_]Feature{
1398 .features = featureSet(&all_features, &[_]Feature{
16841399 .thunderxt88,
16851400 }),
16861401 };
16871402 pub const tsv110 = Cpu{
16881403 .name = "tsv110",
16891404 .llvm_name = "tsv110",
1690 .features = featureSet(&[_]Feature{
1405 .features = featureSet(&all_features, &[_]Feature{
16911406 .tsv110,
16921407 }),
16931408 };
lib/std/target/amdgpu.zig+155-362
......@@ -114,281 +114,206 @@ pub const Feature = enum {
114114pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
115115
116116pub const all_features = blk: {
117 @setEvalBranchQuota(10000);
117118 const len = @typeInfo(Feature).Enum.fields.len;
118 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
119 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
119120 var result: [len]Cpu.Feature = undefined;
120121 result[@enumToInt(Feature.@"16_bit_insts")] = .{
121 .index = @enumToInt(Feature.@"16_bit_insts"),
122 .name = @tagName(Feature.@"16_bit_insts"),
123122 .llvm_name = "16-bit-insts",
124123 .description = "Has i16/f16 instructions",
125 .dependencies = featureSet(&[_]Feature{}),
124 .dependencies = sparseFeatureSet(&[_]Feature{}),
126125 };
127126 result[@enumToInt(Feature.DumpCode)] = .{
128 .index = @enumToInt(Feature.DumpCode),
129 .name = @tagName(Feature.DumpCode),
130127 .llvm_name = "DumpCode",
131128 .description = "Dump MachineInstrs in the CodeEmitter",
132 .dependencies = featureSet(&[_]Feature{}),
129 .dependencies = sparseFeatureSet(&[_]Feature{}),
133130 };
134131 result[@enumToInt(Feature.add_no_carry_insts)] = .{
135 .index = @enumToInt(Feature.add_no_carry_insts),
136 .name = @tagName(Feature.add_no_carry_insts),
137132 .llvm_name = "add-no-carry-insts",
138133 .description = "Have VALU add/sub instructions without carry out",
139 .dependencies = featureSet(&[_]Feature{}),
134 .dependencies = sparseFeatureSet(&[_]Feature{}),
140135 };
141136 result[@enumToInt(Feature.aperture_regs)] = .{
142 .index = @enumToInt(Feature.aperture_regs),
143 .name = @tagName(Feature.aperture_regs),
144137 .llvm_name = "aperture-regs",
145138 .description = "Has Memory Aperture Base and Size Registers",
146 .dependencies = featureSet(&[_]Feature{}),
139 .dependencies = sparseFeatureSet(&[_]Feature{}),
147140 };
148141 result[@enumToInt(Feature.atomic_fadd_insts)] = .{
149 .index = @enumToInt(Feature.atomic_fadd_insts),
150 .name = @tagName(Feature.atomic_fadd_insts),
151142 .llvm_name = "atomic-fadd-insts",
152143 .description = "Has buffer_atomic_add_f32, buffer_atomic_pk_add_f16, global_atomic_add_f32, global_atomic_pk_add_f16 instructions",
153 .dependencies = featureSet(&[_]Feature{}),
144 .dependencies = sparseFeatureSet(&[_]Feature{}),
154145 };
155146 result[@enumToInt(Feature.auto_waitcnt_before_barrier)] = .{
156 .index = @enumToInt(Feature.auto_waitcnt_before_barrier),
157 .name = @tagName(Feature.auto_waitcnt_before_barrier),
158147 .llvm_name = "auto-waitcnt-before-barrier",
159148 .description = "Hardware automatically inserts waitcnt before barrier",
160 .dependencies = featureSet(&[_]Feature{}),
149 .dependencies = sparseFeatureSet(&[_]Feature{}),
161150 };
162151 result[@enumToInt(Feature.ci_insts)] = .{
163 .index = @enumToInt(Feature.ci_insts),
164 .name = @tagName(Feature.ci_insts),
165152 .llvm_name = "ci-insts",
166153 .description = "Additional instructions for CI+",
167 .dependencies = featureSet(&[_]Feature{}),
154 .dependencies = sparseFeatureSet(&[_]Feature{}),
168155 };
169156 result[@enumToInt(Feature.code_object_v3)] = .{
170 .index = @enumToInt(Feature.code_object_v3),
171 .name = @tagName(Feature.code_object_v3),
172157 .llvm_name = "code-object-v3",
173158 .description = "Generate code object version 3",
174 .dependencies = featureSet(&[_]Feature{}),
159 .dependencies = sparseFeatureSet(&[_]Feature{}),
175160 };
176161 result[@enumToInt(Feature.cumode)] = .{
177 .index = @enumToInt(Feature.cumode),
178 .name = @tagName(Feature.cumode),
179162 .llvm_name = "cumode",
180163 .description = "Enable CU wavefront execution mode",
181 .dependencies = featureSet(&[_]Feature{}),
164 .dependencies = sparseFeatureSet(&[_]Feature{}),
182165 };
183166 result[@enumToInt(Feature.dl_insts)] = .{
184 .index = @enumToInt(Feature.dl_insts),
185 .name = @tagName(Feature.dl_insts),
186167 .llvm_name = "dl-insts",
187168 .description = "Has v_fmac_f32 and v_xnor_b32 instructions",
188 .dependencies = featureSet(&[_]Feature{}),
169 .dependencies = sparseFeatureSet(&[_]Feature{}),
189170 };
190171 result[@enumToInt(Feature.dot1_insts)] = .{
191 .index = @enumToInt(Feature.dot1_insts),
192 .name = @tagName(Feature.dot1_insts),
193172 .llvm_name = "dot1-insts",
194173 .description = "Has v_dot4_i32_i8 and v_dot8_i32_i4 instructions",
195 .dependencies = featureSet(&[_]Feature{}),
174 .dependencies = sparseFeatureSet(&[_]Feature{}),
196175 };
197176 result[@enumToInt(Feature.dot2_insts)] = .{
198 .index = @enumToInt(Feature.dot2_insts),
199 .name = @tagName(Feature.dot2_insts),
200177 .llvm_name = "dot2-insts",
201178 .description = "Has v_dot2_f32_f16, v_dot2_i32_i16, v_dot2_u32_u16, v_dot4_u32_u8, v_dot8_u32_u4 instructions",
202 .dependencies = featureSet(&[_]Feature{}),
179 .dependencies = sparseFeatureSet(&[_]Feature{}),
203180 };
204181 result[@enumToInt(Feature.dot3_insts)] = .{
205 .index = @enumToInt(Feature.dot3_insts),
206 .name = @tagName(Feature.dot3_insts),
207182 .llvm_name = "dot3-insts",
208183 .description = "Has v_dot8c_i32_i4 instruction",
209 .dependencies = featureSet(&[_]Feature{}),
184 .dependencies = sparseFeatureSet(&[_]Feature{}),
210185 };
211186 result[@enumToInt(Feature.dot4_insts)] = .{
212 .index = @enumToInt(Feature.dot4_insts),
213 .name = @tagName(Feature.dot4_insts),
214187 .llvm_name = "dot4-insts",
215188 .description = "Has v_dot2c_i32_i16 instruction",
216 .dependencies = featureSet(&[_]Feature{}),
189 .dependencies = sparseFeatureSet(&[_]Feature{}),
217190 };
218191 result[@enumToInt(Feature.dot5_insts)] = .{
219 .index = @enumToInt(Feature.dot5_insts),
220 .name = @tagName(Feature.dot5_insts),
221192 .llvm_name = "dot5-insts",
222193 .description = "Has v_dot2c_f32_f16 instruction",
223 .dependencies = featureSet(&[_]Feature{}),
194 .dependencies = sparseFeatureSet(&[_]Feature{}),
224195 };
225196 result[@enumToInt(Feature.dot6_insts)] = .{
226 .index = @enumToInt(Feature.dot6_insts),
227 .name = @tagName(Feature.dot6_insts),
228197 .llvm_name = "dot6-insts",
229198 .description = "Has v_dot4c_i32_i8 instruction",
230 .dependencies = featureSet(&[_]Feature{}),
199 .dependencies = sparseFeatureSet(&[_]Feature{}),
231200 };
232201 result[@enumToInt(Feature.dpp)] = .{
233 .index = @enumToInt(Feature.dpp),
234 .name = @tagName(Feature.dpp),
235202 .llvm_name = "dpp",
236203 .description = "Support DPP (Data Parallel Primitives) extension",
237 .dependencies = featureSet(&[_]Feature{}),
204 .dependencies = sparseFeatureSet(&[_]Feature{}),
238205 };
239206 result[@enumToInt(Feature.dpp8)] = .{
240 .index = @enumToInt(Feature.dpp8),
241 .name = @tagName(Feature.dpp8),
242207 .llvm_name = "dpp8",
243208 .description = "Support DPP8 (Data Parallel Primitives) extension",
244 .dependencies = featureSet(&[_]Feature{}),
209 .dependencies = sparseFeatureSet(&[_]Feature{}),
245210 };
246211 result[@enumToInt(Feature.dumpcode)] = .{
247 .index = @enumToInt(Feature.dumpcode),
248 .name = @tagName(Feature.dumpcode),
249212 .llvm_name = "dumpcode",
250213 .description = "Dump MachineInstrs in the CodeEmitter",
251 .dependencies = featureSet(&[_]Feature{}),
214 .dependencies = sparseFeatureSet(&[_]Feature{}),
252215 };
253216 result[@enumToInt(Feature.enable_ds128)] = .{
254 .index = @enumToInt(Feature.enable_ds128),
255 .name = @tagName(Feature.enable_ds128),
256217 .llvm_name = "enable-ds128",
257218 .description = "Use ds_read|write_b128",
258 .dependencies = featureSet(&[_]Feature{}),
219 .dependencies = sparseFeatureSet(&[_]Feature{}),
259220 };
260221 result[@enumToInt(Feature.enable_prt_strict_null)] = .{
261 .index = @enumToInt(Feature.enable_prt_strict_null),
262 .name = @tagName(Feature.enable_prt_strict_null),
263222 .llvm_name = "enable-prt-strict-null",
264223 .description = "Enable zeroing of result registers for sparse texture fetches",
265 .dependencies = featureSet(&[_]Feature{}),
224 .dependencies = sparseFeatureSet(&[_]Feature{}),
266225 };
267226 result[@enumToInt(Feature.fast_fmaf)] = .{
268 .index = @enumToInt(Feature.fast_fmaf),
269 .name = @tagName(Feature.fast_fmaf),
270227 .llvm_name = "fast-fmaf",
271228 .description = "Assuming f32 fma is at least as fast as mul + add",
272 .dependencies = featureSet(&[_]Feature{}),
229 .dependencies = sparseFeatureSet(&[_]Feature{}),
273230 };
274231 result[@enumToInt(Feature.flat_address_space)] = .{
275 .index = @enumToInt(Feature.flat_address_space),
276 .name = @tagName(Feature.flat_address_space),
277232 .llvm_name = "flat-address-space",
278233 .description = "Support flat address space",
279 .dependencies = featureSet(&[_]Feature{}),
234 .dependencies = sparseFeatureSet(&[_]Feature{}),
280235 };
281236 result[@enumToInt(Feature.flat_for_global)] = .{
282 .index = @enumToInt(Feature.flat_for_global),
283 .name = @tagName(Feature.flat_for_global),
284237 .llvm_name = "flat-for-global",
285238 .description = "Force to generate flat instruction for global",
286 .dependencies = featureSet(&[_]Feature{}),
239 .dependencies = sparseFeatureSet(&[_]Feature{}),
287240 };
288241 result[@enumToInt(Feature.flat_global_insts)] = .{
289 .index = @enumToInt(Feature.flat_global_insts),
290 .name = @tagName(Feature.flat_global_insts),
291242 .llvm_name = "flat-global-insts",
292243 .description = "Have global_* flat memory instructions",
293 .dependencies = featureSet(&[_]Feature{}),
244 .dependencies = sparseFeatureSet(&[_]Feature{}),
294245 };
295246 result[@enumToInt(Feature.flat_inst_offsets)] = .{
296 .index = @enumToInt(Feature.flat_inst_offsets),
297 .name = @tagName(Feature.flat_inst_offsets),
298247 .llvm_name = "flat-inst-offsets",
299248 .description = "Flat instructions have immediate offset addressing mode",
300 .dependencies = featureSet(&[_]Feature{}),
249 .dependencies = sparseFeatureSet(&[_]Feature{}),
301250 };
302251 result[@enumToInt(Feature.flat_scratch_insts)] = .{
303 .index = @enumToInt(Feature.flat_scratch_insts),
304 .name = @tagName(Feature.flat_scratch_insts),
305252 .llvm_name = "flat-scratch-insts",
306253 .description = "Have scratch_* flat memory instructions",
307 .dependencies = featureSet(&[_]Feature{}),
254 .dependencies = sparseFeatureSet(&[_]Feature{}),
308255 };
309256 result[@enumToInt(Feature.flat_segment_offset_bug)] = .{
310 .index = @enumToInt(Feature.flat_segment_offset_bug),
311 .name = @tagName(Feature.flat_segment_offset_bug),
312257 .llvm_name = "flat-segment-offset-bug",
313258 .description = "GFX10 bug, inst_offset ignored in flat segment",
314 .dependencies = featureSet(&[_]Feature{}),
259 .dependencies = sparseFeatureSet(&[_]Feature{}),
315260 };
316261 result[@enumToInt(Feature.fma_mix_insts)] = .{
317 .index = @enumToInt(Feature.fma_mix_insts),
318 .name = @tagName(Feature.fma_mix_insts),
319262 .llvm_name = "fma-mix-insts",
320263 .description = "Has v_fma_mix_f32, v_fma_mixlo_f16, v_fma_mixhi_f16 instructions",
321 .dependencies = featureSet(&[_]Feature{}),
264 .dependencies = sparseFeatureSet(&[_]Feature{}),
322265 };
323266 result[@enumToInt(Feature.fmaf)] = .{
324 .index = @enumToInt(Feature.fmaf),
325 .name = @tagName(Feature.fmaf),
326267 .llvm_name = "fmaf",
327268 .description = "Enable single precision FMA (not as fast as mul+add, but fused)",
328 .dependencies = featureSet(&[_]Feature{}),
269 .dependencies = sparseFeatureSet(&[_]Feature{}),
329270 };
330271 result[@enumToInt(Feature.fp_exceptions)] = .{
331 .index = @enumToInt(Feature.fp_exceptions),
332 .name = @tagName(Feature.fp_exceptions),
333272 .llvm_name = "fp-exceptions",
334273 .description = "Enable floating point exceptions",
335 .dependencies = featureSet(&[_]Feature{}),
274 .dependencies = sparseFeatureSet(&[_]Feature{}),
336275 };
337276 result[@enumToInt(Feature.fp16_denormals)] = .{
338 .index = @enumToInt(Feature.fp16_denormals),
339 .name = @tagName(Feature.fp16_denormals),
340277 .llvm_name = "fp16-denormals",
341278 .description = "Enable half precision denormal handling",
342 .dependencies = featureSet(&[_]Feature{
279 .dependencies = sparseFeatureSet(&[_]Feature{
343280 .fp64_fp16_denormals,
344281 }),
345282 };
346283 result[@enumToInt(Feature.fp32_denormals)] = .{
347 .index = @enumToInt(Feature.fp32_denormals),
348 .name = @tagName(Feature.fp32_denormals),
349284 .llvm_name = "fp32-denormals",
350285 .description = "Enable single precision denormal handling",
351 .dependencies = featureSet(&[_]Feature{}),
286 .dependencies = sparseFeatureSet(&[_]Feature{}),
352287 };
353288 result[@enumToInt(Feature.fp64)] = .{
354 .index = @enumToInt(Feature.fp64),
355 .name = @tagName(Feature.fp64),
356289 .llvm_name = "fp64",
357290 .description = "Enable double precision operations",
358 .dependencies = featureSet(&[_]Feature{}),
291 .dependencies = sparseFeatureSet(&[_]Feature{}),
359292 };
360293 result[@enumToInt(Feature.fp64_denormals)] = .{
361 .index = @enumToInt(Feature.fp64_denormals),
362 .name = @tagName(Feature.fp64_denormals),
363294 .llvm_name = "fp64-denormals",
364295 .description = "Enable double and half precision denormal handling",
365 .dependencies = featureSet(&[_]Feature{
296 .dependencies = sparseFeatureSet(&[_]Feature{
366297 .fp64,
367298 .fp64_fp16_denormals,
368299 }),
369300 };
370301 result[@enumToInt(Feature.fp64_fp16_denormals)] = .{
371 .index = @enumToInt(Feature.fp64_fp16_denormals),
372 .name = @tagName(Feature.fp64_fp16_denormals),
373302 .llvm_name = "fp64-fp16-denormals",
374303 .description = "Enable double and half precision denormal handling",
375 .dependencies = featureSet(&[_]Feature{
304 .dependencies = sparseFeatureSet(&[_]Feature{
376305 .fp64,
377306 }),
378307 };
379308 result[@enumToInt(Feature.gcn3_encoding)] = .{
380 .index = @enumToInt(Feature.gcn3_encoding),
381 .name = @tagName(Feature.gcn3_encoding),
382309 .llvm_name = "gcn3-encoding",
383310 .description = "Encoding format for VI",
384 .dependencies = featureSet(&[_]Feature{}),
311 .dependencies = sparseFeatureSet(&[_]Feature{}),
385312 };
386313 result[@enumToInt(Feature.gfx10)] = .{
387 .index = @enumToInt(Feature.gfx10),
388 .name = @tagName(Feature.gfx10),
389314 .llvm_name = "gfx10",
390315 .description = "GFX10 GPU generation",
391 .dependencies = featureSet(&[_]Feature{
316 .dependencies = sparseFeatureSet(&[_]Feature{
392317 .@"16_bit_insts",
393318 .add_no_carry_insts,
394319 .aperture_regs,
......@@ -426,32 +351,24 @@ pub const all_features = blk: {
426351 }),
427352 };
428353 result[@enumToInt(Feature.gfx10_insts)] = .{
429 .index = @enumToInt(Feature.gfx10_insts),
430 .name = @tagName(Feature.gfx10_insts),
431354 .llvm_name = "gfx10-insts",
432355 .description = "Additional instructions for GFX10+",
433 .dependencies = featureSet(&[_]Feature{}),
356 .dependencies = sparseFeatureSet(&[_]Feature{}),
434357 };
435358 result[@enumToInt(Feature.gfx7_gfx8_gfx9_insts)] = .{
436 .index = @enumToInt(Feature.gfx7_gfx8_gfx9_insts),
437 .name = @tagName(Feature.gfx7_gfx8_gfx9_insts),
438359 .llvm_name = "gfx7-gfx8-gfx9-insts",
439360 .description = "Instructions shared in GFX7, GFX8, GFX9",
440 .dependencies = featureSet(&[_]Feature{}),
361 .dependencies = sparseFeatureSet(&[_]Feature{}),
441362 };
442363 result[@enumToInt(Feature.gfx8_insts)] = .{
443 .index = @enumToInt(Feature.gfx8_insts),
444 .name = @tagName(Feature.gfx8_insts),
445364 .llvm_name = "gfx8-insts",
446365 .description = "Additional instructions for GFX8+",
447 .dependencies = featureSet(&[_]Feature{}),
366 .dependencies = sparseFeatureSet(&[_]Feature{}),
448367 };
449368 result[@enumToInt(Feature.gfx9)] = .{
450 .index = @enumToInt(Feature.gfx9),
451 .name = @tagName(Feature.gfx9),
452369 .llvm_name = "gfx9",
453370 .description = "GFX9 GPU generation",
454 .dependencies = featureSet(&[_]Feature{
371 .dependencies = sparseFeatureSet(&[_]Feature{
455372 .@"16_bit_insts",
456373 .add_no_carry_insts,
457374 .aperture_regs,
......@@ -485,298 +402,214 @@ pub const all_features = blk: {
485402 }),
486403 };
487404 result[@enumToInt(Feature.gfx9_insts)] = .{
488 .index = @enumToInt(Feature.gfx9_insts),
489 .name = @tagName(Feature.gfx9_insts),
490405 .llvm_name = "gfx9-insts",
491406 .description = "Additional instructions for GFX9+",
492 .dependencies = featureSet(&[_]Feature{}),
407 .dependencies = sparseFeatureSet(&[_]Feature{}),
493408 };
494409 result[@enumToInt(Feature.half_rate_64_ops)] = .{
495 .index = @enumToInt(Feature.half_rate_64_ops),
496 .name = @tagName(Feature.half_rate_64_ops),
497410 .llvm_name = "half-rate-64-ops",
498411 .description = "Most fp64 instructions are half rate instead of quarter",
499 .dependencies = featureSet(&[_]Feature{}),
412 .dependencies = sparseFeatureSet(&[_]Feature{}),
500413 };
501414 result[@enumToInt(Feature.inst_fwd_prefetch_bug)] = .{
502 .index = @enumToInt(Feature.inst_fwd_prefetch_bug),
503 .name = @tagName(Feature.inst_fwd_prefetch_bug),
504415 .llvm_name = "inst-fwd-prefetch-bug",
505416 .description = "S_INST_PREFETCH instruction causes shader to hang",
506 .dependencies = featureSet(&[_]Feature{}),
417 .dependencies = sparseFeatureSet(&[_]Feature{}),
507418 };
508419 result[@enumToInt(Feature.int_clamp_insts)] = .{
509 .index = @enumToInt(Feature.int_clamp_insts),
510 .name = @tagName(Feature.int_clamp_insts),
511420 .llvm_name = "int-clamp-insts",
512421 .description = "Support clamp for integer destination",
513 .dependencies = featureSet(&[_]Feature{}),
422 .dependencies = sparseFeatureSet(&[_]Feature{}),
514423 };
515424 result[@enumToInt(Feature.inv_2pi_inline_imm)] = .{
516 .index = @enumToInt(Feature.inv_2pi_inline_imm),
517 .name = @tagName(Feature.inv_2pi_inline_imm),
518425 .llvm_name = "inv-2pi-inline-imm",
519426 .description = "Has 1 / (2 * pi) as inline immediate",
520 .dependencies = featureSet(&[_]Feature{}),
427 .dependencies = sparseFeatureSet(&[_]Feature{}),
521428 };
522429 result[@enumToInt(Feature.lds_branch_vmem_war_hazard)] = .{
523 .index = @enumToInt(Feature.lds_branch_vmem_war_hazard),
524 .name = @tagName(Feature.lds_branch_vmem_war_hazard),
525430 .llvm_name = "lds-branch-vmem-war-hazard",
526431 .description = "Switching between LDS and VMEM-tex not waiting VM_VSRC=0",
527 .dependencies = featureSet(&[_]Feature{}),
432 .dependencies = sparseFeatureSet(&[_]Feature{}),
528433 };
529434 result[@enumToInt(Feature.lds_misaligned_bug)] = .{
530 .index = @enumToInt(Feature.lds_misaligned_bug),
531 .name = @tagName(Feature.lds_misaligned_bug),
532435 .llvm_name = "lds-misaligned-bug",
533436 .description = "Some GFX10 bug with misaligned multi-dword LDS access in WGP mode",
534 .dependencies = featureSet(&[_]Feature{}),
437 .dependencies = sparseFeatureSet(&[_]Feature{}),
535438 };
536439 result[@enumToInt(Feature.ldsbankcount16)] = .{
537 .index = @enumToInt(Feature.ldsbankcount16),
538 .name = @tagName(Feature.ldsbankcount16),
539440 .llvm_name = "ldsbankcount16",
540441 .description = "The number of LDS banks per compute unit.",
541 .dependencies = featureSet(&[_]Feature{}),
442 .dependencies = sparseFeatureSet(&[_]Feature{}),
542443 };
543444 result[@enumToInt(Feature.ldsbankcount32)] = .{
544 .index = @enumToInt(Feature.ldsbankcount32),
545 .name = @tagName(Feature.ldsbankcount32),
546445 .llvm_name = "ldsbankcount32",
547446 .description = "The number of LDS banks per compute unit.",
548 .dependencies = featureSet(&[_]Feature{}),
447 .dependencies = sparseFeatureSet(&[_]Feature{}),
549448 };
550449 result[@enumToInt(Feature.load_store_opt)] = .{
551 .index = @enumToInt(Feature.load_store_opt),
552 .name = @tagName(Feature.load_store_opt),
553450 .llvm_name = "load-store-opt",
554451 .description = "Enable SI load/store optimizer pass",
555 .dependencies = featureSet(&[_]Feature{}),
452 .dependencies = sparseFeatureSet(&[_]Feature{}),
556453 };
557454 result[@enumToInt(Feature.localmemorysize0)] = .{
558 .index = @enumToInt(Feature.localmemorysize0),
559 .name = @tagName(Feature.localmemorysize0),
560455 .llvm_name = "localmemorysize0",
561456 .description = "The size of local memory in bytes",
562 .dependencies = featureSet(&[_]Feature{}),
457 .dependencies = sparseFeatureSet(&[_]Feature{}),
563458 };
564459 result[@enumToInt(Feature.localmemorysize32768)] = .{
565 .index = @enumToInt(Feature.localmemorysize32768),
566 .name = @tagName(Feature.localmemorysize32768),
567460 .llvm_name = "localmemorysize32768",
568461 .description = "The size of local memory in bytes",
569 .dependencies = featureSet(&[_]Feature{}),
462 .dependencies = sparseFeatureSet(&[_]Feature{}),
570463 };
571464 result[@enumToInt(Feature.localmemorysize65536)] = .{
572 .index = @enumToInt(Feature.localmemorysize65536),
573 .name = @tagName(Feature.localmemorysize65536),
574465 .llvm_name = "localmemorysize65536",
575466 .description = "The size of local memory in bytes",
576 .dependencies = featureSet(&[_]Feature{}),
467 .dependencies = sparseFeatureSet(&[_]Feature{}),
577468 };
578469 result[@enumToInt(Feature.mad_mix_insts)] = .{
579 .index = @enumToInt(Feature.mad_mix_insts),
580 .name = @tagName(Feature.mad_mix_insts),
581470 .llvm_name = "mad-mix-insts",
582471 .description = "Has v_mad_mix_f32, v_mad_mixlo_f16, v_mad_mixhi_f16 instructions",
583 .dependencies = featureSet(&[_]Feature{}),
472 .dependencies = sparseFeatureSet(&[_]Feature{}),
584473 };
585474 result[@enumToInt(Feature.mai_insts)] = .{
586 .index = @enumToInt(Feature.mai_insts),
587 .name = @tagName(Feature.mai_insts),
588475 .llvm_name = "mai-insts",
589476 .description = "Has mAI instructions",
590 .dependencies = featureSet(&[_]Feature{}),
477 .dependencies = sparseFeatureSet(&[_]Feature{}),
591478 };
592479 result[@enumToInt(Feature.max_private_element_size_16)] = .{
593 .index = @enumToInt(Feature.max_private_element_size_16),
594 .name = @tagName(Feature.max_private_element_size_16),
595480 .llvm_name = "max-private-element-size-16",
596481 .description = "Maximum private access size may be 16",
597 .dependencies = featureSet(&[_]Feature{}),
482 .dependencies = sparseFeatureSet(&[_]Feature{}),
598483 };
599484 result[@enumToInt(Feature.max_private_element_size_4)] = .{
600 .index = @enumToInt(Feature.max_private_element_size_4),
601 .name = @tagName(Feature.max_private_element_size_4),
602485 .llvm_name = "max-private-element-size-4",
603486 .description = "Maximum private access size may be 4",
604 .dependencies = featureSet(&[_]Feature{}),
487 .dependencies = sparseFeatureSet(&[_]Feature{}),
605488 };
606489 result[@enumToInt(Feature.max_private_element_size_8)] = .{
607 .index = @enumToInt(Feature.max_private_element_size_8),
608 .name = @tagName(Feature.max_private_element_size_8),
609490 .llvm_name = "max-private-element-size-8",
610491 .description = "Maximum private access size may be 8",
611 .dependencies = featureSet(&[_]Feature{}),
492 .dependencies = sparseFeatureSet(&[_]Feature{}),
612493 };
613494 result[@enumToInt(Feature.mimg_r128)] = .{
614 .index = @enumToInt(Feature.mimg_r128),
615 .name = @tagName(Feature.mimg_r128),
616495 .llvm_name = "mimg-r128",
617496 .description = "Support 128-bit texture resources",
618 .dependencies = featureSet(&[_]Feature{}),
497 .dependencies = sparseFeatureSet(&[_]Feature{}),
619498 };
620499 result[@enumToInt(Feature.movrel)] = .{
621 .index = @enumToInt(Feature.movrel),
622 .name = @tagName(Feature.movrel),
623500 .llvm_name = "movrel",
624501 .description = "Has v_movrel*_b32 instructions",
625 .dependencies = featureSet(&[_]Feature{}),
502 .dependencies = sparseFeatureSet(&[_]Feature{}),
626503 };
627504 result[@enumToInt(Feature.no_data_dep_hazard)] = .{
628 .index = @enumToInt(Feature.no_data_dep_hazard),
629 .name = @tagName(Feature.no_data_dep_hazard),
630505 .llvm_name = "no-data-dep-hazard",
631506 .description = "Does not need SW waitstates",
632 .dependencies = featureSet(&[_]Feature{}),
507 .dependencies = sparseFeatureSet(&[_]Feature{}),
633508 };
634509 result[@enumToInt(Feature.no_sdst_cmpx)] = .{
635 .index = @enumToInt(Feature.no_sdst_cmpx),
636 .name = @tagName(Feature.no_sdst_cmpx),
637510 .llvm_name = "no-sdst-cmpx",
638511 .description = "V_CMPX does not write VCC/SGPR in addition to EXEC",
639 .dependencies = featureSet(&[_]Feature{}),
512 .dependencies = sparseFeatureSet(&[_]Feature{}),
640513 };
641514 result[@enumToInt(Feature.no_sram_ecc_support)] = .{
642 .index = @enumToInt(Feature.no_sram_ecc_support),
643 .name = @tagName(Feature.no_sram_ecc_support),
644515 .llvm_name = "no-sram-ecc-support",
645516 .description = "Hardware does not support SRAM ECC",
646 .dependencies = featureSet(&[_]Feature{}),
517 .dependencies = sparseFeatureSet(&[_]Feature{}),
647518 };
648519 result[@enumToInt(Feature.no_xnack_support)] = .{
649 .index = @enumToInt(Feature.no_xnack_support),
650 .name = @tagName(Feature.no_xnack_support),
651520 .llvm_name = "no-xnack-support",
652521 .description = "Hardware does not support XNACK",
653 .dependencies = featureSet(&[_]Feature{}),
522 .dependencies = sparseFeatureSet(&[_]Feature{}),
654523 };
655524 result[@enumToInt(Feature.nsa_encoding)] = .{
656 .index = @enumToInt(Feature.nsa_encoding),
657 .name = @tagName(Feature.nsa_encoding),
658525 .llvm_name = "nsa-encoding",
659526 .description = "Support NSA encoding for image instructions",
660 .dependencies = featureSet(&[_]Feature{}),
527 .dependencies = sparseFeatureSet(&[_]Feature{}),
661528 };
662529 result[@enumToInt(Feature.nsa_to_vmem_bug)] = .{
663 .index = @enumToInt(Feature.nsa_to_vmem_bug),
664 .name = @tagName(Feature.nsa_to_vmem_bug),
665530 .llvm_name = "nsa-to-vmem-bug",
666531 .description = "MIMG-NSA followed by VMEM fail if EXEC_LO or EXEC_HI equals zero",
667 .dependencies = featureSet(&[_]Feature{}),
532 .dependencies = sparseFeatureSet(&[_]Feature{}),
668533 };
669534 result[@enumToInt(Feature.offset_3f_bug)] = .{
670 .index = @enumToInt(Feature.offset_3f_bug),
671 .name = @tagName(Feature.offset_3f_bug),
672535 .llvm_name = "offset-3f-bug",
673536 .description = "Branch offset of 3f hardware bug",
674 .dependencies = featureSet(&[_]Feature{}),
537 .dependencies = sparseFeatureSet(&[_]Feature{}),
675538 };
676539 result[@enumToInt(Feature.pk_fmac_f16_inst)] = .{
677 .index = @enumToInt(Feature.pk_fmac_f16_inst),
678 .name = @tagName(Feature.pk_fmac_f16_inst),
679540 .llvm_name = "pk-fmac-f16-inst",
680541 .description = "Has v_pk_fmac_f16 instruction",
681 .dependencies = featureSet(&[_]Feature{}),
542 .dependencies = sparseFeatureSet(&[_]Feature{}),
682543 };
683544 result[@enumToInt(Feature.promote_alloca)] = .{
684 .index = @enumToInt(Feature.promote_alloca),
685 .name = @tagName(Feature.promote_alloca),
686545 .llvm_name = "promote-alloca",
687546 .description = "Enable promote alloca pass",
688 .dependencies = featureSet(&[_]Feature{}),
547 .dependencies = sparseFeatureSet(&[_]Feature{}),
689548 };
690549 result[@enumToInt(Feature.r128_a16)] = .{
691 .index = @enumToInt(Feature.r128_a16),
692 .name = @tagName(Feature.r128_a16),
693550 .llvm_name = "r128-a16",
694551 .description = "Support 16 bit coordindates/gradients/lod/clamp/mip types on gfx9",
695 .dependencies = featureSet(&[_]Feature{}),
552 .dependencies = sparseFeatureSet(&[_]Feature{}),
696553 };
697554 result[@enumToInt(Feature.register_banking)] = .{
698 .index = @enumToInt(Feature.register_banking),
699 .name = @tagName(Feature.register_banking),
700555 .llvm_name = "register-banking",
701556 .description = "Has register banking",
702 .dependencies = featureSet(&[_]Feature{}),
557 .dependencies = sparseFeatureSet(&[_]Feature{}),
703558 };
704559 result[@enumToInt(Feature.s_memrealtime)] = .{
705 .index = @enumToInt(Feature.s_memrealtime),
706 .name = @tagName(Feature.s_memrealtime),
707560 .llvm_name = "s-memrealtime",
708561 .description = "Has s_memrealtime instruction",
709 .dependencies = featureSet(&[_]Feature{}),
562 .dependencies = sparseFeatureSet(&[_]Feature{}),
710563 };
711564 result[@enumToInt(Feature.scalar_atomics)] = .{
712 .index = @enumToInt(Feature.scalar_atomics),
713 .name = @tagName(Feature.scalar_atomics),
714565 .llvm_name = "scalar-atomics",
715566 .description = "Has atomic scalar memory instructions",
716 .dependencies = featureSet(&[_]Feature{}),
567 .dependencies = sparseFeatureSet(&[_]Feature{}),
717568 };
718569 result[@enumToInt(Feature.scalar_flat_scratch_insts)] = .{
719 .index = @enumToInt(Feature.scalar_flat_scratch_insts),
720 .name = @tagName(Feature.scalar_flat_scratch_insts),
721570 .llvm_name = "scalar-flat-scratch-insts",
722571 .description = "Have s_scratch_* flat memory instructions",
723 .dependencies = featureSet(&[_]Feature{}),
572 .dependencies = sparseFeatureSet(&[_]Feature{}),
724573 };
725574 result[@enumToInt(Feature.scalar_stores)] = .{
726 .index = @enumToInt(Feature.scalar_stores),
727 .name = @tagName(Feature.scalar_stores),
728575 .llvm_name = "scalar-stores",
729576 .description = "Has store scalar memory instructions",
730 .dependencies = featureSet(&[_]Feature{}),
577 .dependencies = sparseFeatureSet(&[_]Feature{}),
731578 };
732579 result[@enumToInt(Feature.sdwa)] = .{
733 .index = @enumToInt(Feature.sdwa),
734 .name = @tagName(Feature.sdwa),
735580 .llvm_name = "sdwa",
736581 .description = "Support SDWA (Sub-DWORD Addressing) extension",
737 .dependencies = featureSet(&[_]Feature{}),
582 .dependencies = sparseFeatureSet(&[_]Feature{}),
738583 };
739584 result[@enumToInt(Feature.sdwa_mav)] = .{
740 .index = @enumToInt(Feature.sdwa_mav),
741 .name = @tagName(Feature.sdwa_mav),
742585 .llvm_name = "sdwa-mav",
743586 .description = "Support v_mac_f32/f16 with SDWA (Sub-DWORD Addressing) extension",
744 .dependencies = featureSet(&[_]Feature{}),
587 .dependencies = sparseFeatureSet(&[_]Feature{}),
745588 };
746589 result[@enumToInt(Feature.sdwa_omod)] = .{
747 .index = @enumToInt(Feature.sdwa_omod),
748 .name = @tagName(Feature.sdwa_omod),
749590 .llvm_name = "sdwa-omod",
750591 .description = "Support OMod with SDWA (Sub-DWORD Addressing) extension",
751 .dependencies = featureSet(&[_]Feature{}),
592 .dependencies = sparseFeatureSet(&[_]Feature{}),
752593 };
753594 result[@enumToInt(Feature.sdwa_out_mods_vopc)] = .{
754 .index = @enumToInt(Feature.sdwa_out_mods_vopc),
755 .name = @tagName(Feature.sdwa_out_mods_vopc),
756595 .llvm_name = "sdwa-out-mods-vopc",
757596 .description = "Support clamp for VOPC with SDWA (Sub-DWORD Addressing) extension",
758 .dependencies = featureSet(&[_]Feature{}),
597 .dependencies = sparseFeatureSet(&[_]Feature{}),
759598 };
760599 result[@enumToInt(Feature.sdwa_scalar)] = .{
761 .index = @enumToInt(Feature.sdwa_scalar),
762 .name = @tagName(Feature.sdwa_scalar),
763600 .llvm_name = "sdwa-scalar",
764601 .description = "Support scalar register with SDWA (Sub-DWORD Addressing) extension",
765 .dependencies = featureSet(&[_]Feature{}),
602 .dependencies = sparseFeatureSet(&[_]Feature{}),
766603 };
767604 result[@enumToInt(Feature.sdwa_sdst)] = .{
768 .index = @enumToInt(Feature.sdwa_sdst),
769 .name = @tagName(Feature.sdwa_sdst),
770605 .llvm_name = "sdwa-sdst",
771606 .description = "Support scalar dst for VOPC with SDWA (Sub-DWORD Addressing) extension",
772 .dependencies = featureSet(&[_]Feature{}),
607 .dependencies = sparseFeatureSet(&[_]Feature{}),
773608 };
774609 result[@enumToInt(Feature.sea_islands)] = .{
775 .index = @enumToInt(Feature.sea_islands),
776 .name = @tagName(Feature.sea_islands),
777610 .llvm_name = "sea-islands",
778611 .description = "SEA_ISLANDS GPU generation",
779 .dependencies = featureSet(&[_]Feature{
612 .dependencies = sparseFeatureSet(&[_]Feature{
780613 .ci_insts,
781614 .flat_address_space,
782615 .fp64,
......@@ -790,32 +623,24 @@ pub const all_features = blk: {
790623 }),
791624 };
792625 result[@enumToInt(Feature.sgpr_init_bug)] = .{
793 .index = @enumToInt(Feature.sgpr_init_bug),
794 .name = @tagName(Feature.sgpr_init_bug),
795626 .llvm_name = "sgpr-init-bug",
796627 .description = "VI SGPR initialization bug requiring a fixed SGPR allocation size",
797 .dependencies = featureSet(&[_]Feature{}),
628 .dependencies = sparseFeatureSet(&[_]Feature{}),
798629 };
799630 result[@enumToInt(Feature.si_scheduler)] = .{
800 .index = @enumToInt(Feature.si_scheduler),
801 .name = @tagName(Feature.si_scheduler),
802631 .llvm_name = "si-scheduler",
803632 .description = "Enable SI Machine Scheduler",
804 .dependencies = featureSet(&[_]Feature{}),
633 .dependencies = sparseFeatureSet(&[_]Feature{}),
805634 };
806635 result[@enumToInt(Feature.smem_to_vector_write_hazard)] = .{
807 .index = @enumToInt(Feature.smem_to_vector_write_hazard),
808 .name = @tagName(Feature.smem_to_vector_write_hazard),
809636 .llvm_name = "smem-to-vector-write-hazard",
810637 .description = "s_load_dword followed by v_cmp page faults",
811 .dependencies = featureSet(&[_]Feature{}),
638 .dependencies = sparseFeatureSet(&[_]Feature{}),
812639 };
813640 result[@enumToInt(Feature.southern_islands)] = .{
814 .index = @enumToInt(Feature.southern_islands),
815 .name = @tagName(Feature.southern_islands),
816641 .llvm_name = "southern-islands",
817642 .description = "SOUTHERN_ISLANDS GPU generation",
818 .dependencies = featureSet(&[_]Feature{
643 .dependencies = sparseFeatureSet(&[_]Feature{
819644 .fp64,
820645 .ldsbankcount32,
821646 .localmemorysize32768,
......@@ -828,88 +653,64 @@ pub const all_features = blk: {
828653 }),
829654 };
830655 result[@enumToInt(Feature.sram_ecc)] = .{
831 .index = @enumToInt(Feature.sram_ecc),
832 .name = @tagName(Feature.sram_ecc),
833656 .llvm_name = "sram-ecc",
834657 .description = "Enable SRAM ECC",
835 .dependencies = featureSet(&[_]Feature{}),
658 .dependencies = sparseFeatureSet(&[_]Feature{}),
836659 };
837660 result[@enumToInt(Feature.trap_handler)] = .{
838 .index = @enumToInt(Feature.trap_handler),
839 .name = @tagName(Feature.trap_handler),
840661 .llvm_name = "trap-handler",
841662 .description = "Trap handler support",
842 .dependencies = featureSet(&[_]Feature{}),
663 .dependencies = sparseFeatureSet(&[_]Feature{}),
843664 };
844665 result[@enumToInt(Feature.trig_reduced_range)] = .{
845 .index = @enumToInt(Feature.trig_reduced_range),
846 .name = @tagName(Feature.trig_reduced_range),
847666 .llvm_name = "trig-reduced-range",
848667 .description = "Requires use of fract on arguments to trig instructions",
849 .dependencies = featureSet(&[_]Feature{}),
668 .dependencies = sparseFeatureSet(&[_]Feature{}),
850669 };
851670 result[@enumToInt(Feature.unaligned_buffer_access)] = .{
852 .index = @enumToInt(Feature.unaligned_buffer_access),
853 .name = @tagName(Feature.unaligned_buffer_access),
854671 .llvm_name = "unaligned-buffer-access",
855672 .description = "Support unaligned global loads and stores",
856 .dependencies = featureSet(&[_]Feature{}),
673 .dependencies = sparseFeatureSet(&[_]Feature{}),
857674 };
858675 result[@enumToInt(Feature.unaligned_scratch_access)] = .{
859 .index = @enumToInt(Feature.unaligned_scratch_access),
860 .name = @tagName(Feature.unaligned_scratch_access),
861676 .llvm_name = "unaligned-scratch-access",
862677 .description = "Support unaligned scratch loads and stores",
863 .dependencies = featureSet(&[_]Feature{}),
678 .dependencies = sparseFeatureSet(&[_]Feature{}),
864679 };
865680 result[@enumToInt(Feature.unpacked_d16_vmem)] = .{
866 .index = @enumToInt(Feature.unpacked_d16_vmem),
867 .name = @tagName(Feature.unpacked_d16_vmem),
868681 .llvm_name = "unpacked-d16-vmem",
869682 .description = "Has unpacked d16 vmem instructions",
870 .dependencies = featureSet(&[_]Feature{}),
683 .dependencies = sparseFeatureSet(&[_]Feature{}),
871684 };
872685 result[@enumToInt(Feature.unsafe_ds_offset_folding)] = .{
873 .index = @enumToInt(Feature.unsafe_ds_offset_folding),
874 .name = @tagName(Feature.unsafe_ds_offset_folding),
875686 .llvm_name = "unsafe-ds-offset-folding",
876687 .description = "Force using DS instruction immediate offsets on SI",
877 .dependencies = featureSet(&[_]Feature{}),
688 .dependencies = sparseFeatureSet(&[_]Feature{}),
878689 };
879690 result[@enumToInt(Feature.vcmpx_exec_war_hazard)] = .{
880 .index = @enumToInt(Feature.vcmpx_exec_war_hazard),
881 .name = @tagName(Feature.vcmpx_exec_war_hazard),
882691 .llvm_name = "vcmpx-exec-war-hazard",
883692 .description = "V_CMPX WAR hazard on EXEC (V_CMPX issue ONLY)",
884 .dependencies = featureSet(&[_]Feature{}),
693 .dependencies = sparseFeatureSet(&[_]Feature{}),
885694 };
886695 result[@enumToInt(Feature.vcmpx_permlane_hazard)] = .{
887 .index = @enumToInt(Feature.vcmpx_permlane_hazard),
888 .name = @tagName(Feature.vcmpx_permlane_hazard),
889696 .llvm_name = "vcmpx-permlane-hazard",
890697 .description = "TODO: describe me",
891 .dependencies = featureSet(&[_]Feature{}),
698 .dependencies = sparseFeatureSet(&[_]Feature{}),
892699 };
893700 result[@enumToInt(Feature.vgpr_index_mode)] = .{
894 .index = @enumToInt(Feature.vgpr_index_mode),
895 .name = @tagName(Feature.vgpr_index_mode),
896701 .llvm_name = "vgpr-index-mode",
897702 .description = "Has VGPR mode register indexing",
898 .dependencies = featureSet(&[_]Feature{}),
703 .dependencies = sparseFeatureSet(&[_]Feature{}),
899704 };
900705 result[@enumToInt(Feature.vmem_to_scalar_write_hazard)] = .{
901 .index = @enumToInt(Feature.vmem_to_scalar_write_hazard),
902 .name = @tagName(Feature.vmem_to_scalar_write_hazard),
903706 .llvm_name = "vmem-to-scalar-write-hazard",
904707 .description = "VMEM instruction followed by scalar writing to EXEC mask, M0 or SGPR leads to incorrect execution.",
905 .dependencies = featureSet(&[_]Feature{}),
708 .dependencies = sparseFeatureSet(&[_]Feature{}),
906709 };
907710 result[@enumToInt(Feature.volcanic_islands)] = .{
908 .index = @enumToInt(Feature.volcanic_islands),
909 .name = @tagName(Feature.volcanic_islands),
910711 .llvm_name = "volcanic-islands",
911712 .description = "VOLCANIC_ISLANDS GPU generation",
912 .dependencies = featureSet(&[_]Feature{
713 .dependencies = sparseFeatureSet(&[_]Feature{
913714 .@"16_bit_insts",
914715 .ci_insts,
915716 .dpp,
......@@ -935,54 +736,46 @@ pub const all_features = blk: {
935736 }),
936737 };
937738 result[@enumToInt(Feature.vop3_literal)] = .{
938 .index = @enumToInt(Feature.vop3_literal),
939 .name = @tagName(Feature.vop3_literal),
940739 .llvm_name = "vop3-literal",
941740 .description = "Can use one literal in VOP3",
942 .dependencies = featureSet(&[_]Feature{}),
741 .dependencies = sparseFeatureSet(&[_]Feature{}),
943742 };
944743 result[@enumToInt(Feature.vop3p)] = .{
945 .index = @enumToInt(Feature.vop3p),
946 .name = @tagName(Feature.vop3p),
947744 .llvm_name = "vop3p",
948745 .description = "Has VOP3P packed instructions",
949 .dependencies = featureSet(&[_]Feature{}),
746 .dependencies = sparseFeatureSet(&[_]Feature{}),
950747 };
951748 result[@enumToInt(Feature.vscnt)] = .{
952 .index = @enumToInt(Feature.vscnt),
953 .name = @tagName(Feature.vscnt),
954749 .llvm_name = "vscnt",
955750 .description = "Has separate store vscnt counter",
956 .dependencies = featureSet(&[_]Feature{}),
751 .dependencies = sparseFeatureSet(&[_]Feature{}),
957752 };
958753 result[@enumToInt(Feature.wavefrontsize16)] = .{
959 .index = @enumToInt(Feature.wavefrontsize16),
960 .name = @tagName(Feature.wavefrontsize16),
961754 .llvm_name = "wavefrontsize16",
962755 .description = "The number of threads per wavefront",
963 .dependencies = featureSet(&[_]Feature{}),
756 .dependencies = sparseFeatureSet(&[_]Feature{}),
964757 };
965758 result[@enumToInt(Feature.wavefrontsize32)] = .{
966 .index = @enumToInt(Feature.wavefrontsize32),
967 .name = @tagName(Feature.wavefrontsize32),
968759 .llvm_name = "wavefrontsize32",
969760 .description = "The number of threads per wavefront",
970 .dependencies = featureSet(&[_]Feature{}),
761 .dependencies = sparseFeatureSet(&[_]Feature{}),
971762 };
972763 result[@enumToInt(Feature.wavefrontsize64)] = .{
973 .index = @enumToInt(Feature.wavefrontsize64),
974 .name = @tagName(Feature.wavefrontsize64),
975764 .llvm_name = "wavefrontsize64",
976765 .description = "The number of threads per wavefront",
977 .dependencies = featureSet(&[_]Feature{}),
766 .dependencies = sparseFeatureSet(&[_]Feature{}),
978767 };
979768 result[@enumToInt(Feature.xnack)] = .{
980 .index = @enumToInt(Feature.xnack),
981 .name = @tagName(Feature.xnack),
982769 .llvm_name = "xnack",
983770 .description = "Enable XNACK support",
984 .dependencies = featureSet(&[_]Feature{}),
985 };
771 .dependencies = sparseFeatureSet(&[_]Feature{}),
772 };
773 const ti = @typeInfo(Feature);
774 for (result) |*elem, i| {
775 elem.index = i;
776 elem.name = ti.Enum.fields[i].name;
777 elem.dependencies.initAsDependencies(i, &result);
778 }
986779 break :blk result;
987780};
988781
......@@ -990,7 +783,7 @@ pub const cpu = struct {
990783 pub const bonaire = Cpu{
991784 .name = "bonaire",
992785 .llvm_name = "bonaire",
993 .features = featureSet(&[_]Feature{
786 .features = featureSet(&all_features, &[_]Feature{
994787 .code_object_v3,
995788 .ldsbankcount32,
996789 .no_xnack_support,
......@@ -1000,7 +793,7 @@ pub const cpu = struct {
1000793 pub const carrizo = Cpu{
1001794 .name = "carrizo",
1002795 .llvm_name = "carrizo",
1003 .features = featureSet(&[_]Feature{
796 .features = featureSet(&all_features, &[_]Feature{
1004797 .code_object_v3,
1005798 .fast_fmaf,
1006799 .half_rate_64_ops,
......@@ -1013,7 +806,7 @@ pub const cpu = struct {
1013806 pub const fiji = Cpu{
1014807 .name = "fiji",
1015808 .llvm_name = "fiji",
1016 .features = featureSet(&[_]Feature{
809 .features = featureSet(&all_features, &[_]Feature{
1017810 .code_object_v3,
1018811 .ldsbankcount32,
1019812 .no_xnack_support,
......@@ -1024,14 +817,14 @@ pub const cpu = struct {
1024817 pub const generic = Cpu{
1025818 .name = "generic",
1026819 .llvm_name = "generic",
1027 .features = featureSet(&[_]Feature{
820 .features = featureSet(&all_features, &[_]Feature{
1028821 .wavefrontsize64,
1029822 }),
1030823 };
1031824 pub const generic_hsa = Cpu{
1032825 .name = "generic_hsa",
1033826 .llvm_name = "generic-hsa",
1034 .features = featureSet(&[_]Feature{
827 .features = featureSet(&all_features, &[_]Feature{
1035828 .flat_address_space,
1036829 .wavefrontsize64,
1037830 }),
......@@ -1039,7 +832,7 @@ pub const cpu = struct {
1039832 pub const gfx1010 = Cpu{
1040833 .name = "gfx1010",
1041834 .llvm_name = "gfx1010",
1042 .features = featureSet(&[_]Feature{
835 .features = featureSet(&all_features, &[_]Feature{
1043836 .code_object_v3,
1044837 .dl_insts,
1045838 .flat_segment_offset_bug,
......@@ -1065,7 +858,7 @@ pub const cpu = struct {
1065858 pub const gfx1011 = Cpu{
1066859 .name = "gfx1011",
1067860 .llvm_name = "gfx1011",
1068 .features = featureSet(&[_]Feature{
861 .features = featureSet(&all_features, &[_]Feature{
1069862 .code_object_v3,
1070863 .dl_insts,
1071864 .dot1_insts,
......@@ -1094,7 +887,7 @@ pub const cpu = struct {
1094887 pub const gfx1012 = Cpu{
1095888 .name = "gfx1012",
1096889 .llvm_name = "gfx1012",
1097 .features = featureSet(&[_]Feature{
890 .features = featureSet(&all_features, &[_]Feature{
1098891 .code_object_v3,
1099892 .dl_insts,
1100893 .dot1_insts,
......@@ -1124,7 +917,7 @@ pub const cpu = struct {
1124917 pub const gfx600 = Cpu{
1125918 .name = "gfx600",
1126919 .llvm_name = "gfx600",
1127 .features = featureSet(&[_]Feature{
920 .features = featureSet(&all_features, &[_]Feature{
1128921 .code_object_v3,
1129922 .fast_fmaf,
1130923 .half_rate_64_ops,
......@@ -1136,7 +929,7 @@ pub const cpu = struct {
1136929 pub const gfx601 = Cpu{
1137930 .name = "gfx601",
1138931 .llvm_name = "gfx601",
1139 .features = featureSet(&[_]Feature{
932 .features = featureSet(&all_features, &[_]Feature{
1140933 .code_object_v3,
1141934 .ldsbankcount32,
1142935 .no_xnack_support,
......@@ -1146,7 +939,7 @@ pub const cpu = struct {
1146939 pub const gfx700 = Cpu{
1147940 .name = "gfx700",
1148941 .llvm_name = "gfx700",
1149 .features = featureSet(&[_]Feature{
942 .features = featureSet(&all_features, &[_]Feature{
1150943 .code_object_v3,
1151944 .ldsbankcount32,
1152945 .no_xnack_support,
......@@ -1156,7 +949,7 @@ pub const cpu = struct {
1156949 pub const gfx701 = Cpu{
1157950 .name = "gfx701",
1158951 .llvm_name = "gfx701",
1159 .features = featureSet(&[_]Feature{
952 .features = featureSet(&all_features, &[_]Feature{
1160953 .code_object_v3,
1161954 .fast_fmaf,
1162955 .half_rate_64_ops,
......@@ -1168,7 +961,7 @@ pub const cpu = struct {
1168961 pub const gfx702 = Cpu{
1169962 .name = "gfx702",
1170963 .llvm_name = "gfx702",
1171 .features = featureSet(&[_]Feature{
964 .features = featureSet(&all_features, &[_]Feature{
1172965 .code_object_v3,
1173966 .fast_fmaf,
1174967 .ldsbankcount16,
......@@ -1179,7 +972,7 @@ pub const cpu = struct {
1179972 pub const gfx703 = Cpu{
1180973 .name = "gfx703",
1181974 .llvm_name = "gfx703",
1182 .features = featureSet(&[_]Feature{
975 .features = featureSet(&all_features, &[_]Feature{
1183976 .code_object_v3,
1184977 .ldsbankcount16,
1185978 .no_xnack_support,
......@@ -1189,7 +982,7 @@ pub const cpu = struct {
1189982 pub const gfx704 = Cpu{
1190983 .name = "gfx704",
1191984 .llvm_name = "gfx704",
1192 .features = featureSet(&[_]Feature{
985 .features = featureSet(&all_features, &[_]Feature{
1193986 .code_object_v3,
1194987 .ldsbankcount32,
1195988 .no_xnack_support,
......@@ -1199,7 +992,7 @@ pub const cpu = struct {
1199992 pub const gfx801 = Cpu{
1200993 .name = "gfx801",
1201994 .llvm_name = "gfx801",
1202 .features = featureSet(&[_]Feature{
995 .features = featureSet(&all_features, &[_]Feature{
1203996 .code_object_v3,
1204997 .fast_fmaf,
1205998 .half_rate_64_ops,
......@@ -1212,7 +1005,7 @@ pub const cpu = struct {
12121005 pub const gfx802 = Cpu{
12131006 .name = "gfx802",
12141007 .llvm_name = "gfx802",
1215 .features = featureSet(&[_]Feature{
1008 .features = featureSet(&all_features, &[_]Feature{
12161009 .code_object_v3,
12171010 .ldsbankcount32,
12181011 .no_xnack_support,
......@@ -1224,7 +1017,7 @@ pub const cpu = struct {
12241017 pub const gfx803 = Cpu{
12251018 .name = "gfx803",
12261019 .llvm_name = "gfx803",
1227 .features = featureSet(&[_]Feature{
1020 .features = featureSet(&all_features, &[_]Feature{
12281021 .code_object_v3,
12291022 .ldsbankcount32,
12301023 .no_xnack_support,
......@@ -1235,7 +1028,7 @@ pub const cpu = struct {
12351028 pub const gfx810 = Cpu{
12361029 .name = "gfx810",
12371030 .llvm_name = "gfx810",
1238 .features = featureSet(&[_]Feature{
1031 .features = featureSet(&all_features, &[_]Feature{
12391032 .code_object_v3,
12401033 .ldsbankcount16,
12411034 .volcanic_islands,
......@@ -1245,7 +1038,7 @@ pub const cpu = struct {
12451038 pub const gfx900 = Cpu{
12461039 .name = "gfx900",
12471040 .llvm_name = "gfx900",
1248 .features = featureSet(&[_]Feature{
1041 .features = featureSet(&all_features, &[_]Feature{
12491042 .code_object_v3,
12501043 .gfx9,
12511044 .ldsbankcount32,
......@@ -1257,7 +1050,7 @@ pub const cpu = struct {
12571050 pub const gfx902 = Cpu{
12581051 .name = "gfx902",
12591052 .llvm_name = "gfx902",
1260 .features = featureSet(&[_]Feature{
1053 .features = featureSet(&all_features, &[_]Feature{
12611054 .code_object_v3,
12621055 .gfx9,
12631056 .ldsbankcount32,
......@@ -1269,7 +1062,7 @@ pub const cpu = struct {
12691062 pub const gfx904 = Cpu{
12701063 .name = "gfx904",
12711064 .llvm_name = "gfx904",
1272 .features = featureSet(&[_]Feature{
1065 .features = featureSet(&all_features, &[_]Feature{
12731066 .code_object_v3,
12741067 .fma_mix_insts,
12751068 .gfx9,
......@@ -1281,7 +1074,7 @@ pub const cpu = struct {
12811074 pub const gfx906 = Cpu{
12821075 .name = "gfx906",
12831076 .llvm_name = "gfx906",
1284 .features = featureSet(&[_]Feature{
1077 .features = featureSet(&all_features, &[_]Feature{
12851078 .code_object_v3,
12861079 .dl_insts,
12871080 .dot1_insts,
......@@ -1296,7 +1089,7 @@ pub const cpu = struct {
12961089 pub const gfx908 = Cpu{
12971090 .name = "gfx908",
12981091 .llvm_name = "gfx908",
1299 .features = featureSet(&[_]Feature{
1092 .features = featureSet(&all_features, &[_]Feature{
13001093 .atomic_fadd_insts,
13011094 .code_object_v3,
13021095 .dl_insts,
......@@ -1318,7 +1111,7 @@ pub const cpu = struct {
13181111 pub const gfx909 = Cpu{
13191112 .name = "gfx909",
13201113 .llvm_name = "gfx909",
1321 .features = featureSet(&[_]Feature{
1114 .features = featureSet(&all_features, &[_]Feature{
13221115 .code_object_v3,
13231116 .gfx9,
13241117 .ldsbankcount32,
......@@ -1329,7 +1122,7 @@ pub const cpu = struct {
13291122 pub const hainan = Cpu{
13301123 .name = "hainan",
13311124 .llvm_name = "hainan",
1332 .features = featureSet(&[_]Feature{
1125 .features = featureSet(&all_features, &[_]Feature{
13331126 .code_object_v3,
13341127 .ldsbankcount32,
13351128 .no_xnack_support,
......@@ -1339,7 +1132,7 @@ pub const cpu = struct {
13391132 pub const hawaii = Cpu{
13401133 .name = "hawaii",
13411134 .llvm_name = "hawaii",
1342 .features = featureSet(&[_]Feature{
1135 .features = featureSet(&all_features, &[_]Feature{
13431136 .code_object_v3,
13441137 .fast_fmaf,
13451138 .half_rate_64_ops,
......@@ -1351,7 +1144,7 @@ pub const cpu = struct {
13511144 pub const iceland = Cpu{
13521145 .name = "iceland",
13531146 .llvm_name = "iceland",
1354 .features = featureSet(&[_]Feature{
1147 .features = featureSet(&all_features, &[_]Feature{
13551148 .code_object_v3,
13561149 .ldsbankcount32,
13571150 .no_xnack_support,
......@@ -1363,7 +1156,7 @@ pub const cpu = struct {
13631156 pub const kabini = Cpu{
13641157 .name = "kabini",
13651158 .llvm_name = "kabini",
1366 .features = featureSet(&[_]Feature{
1159 .features = featureSet(&all_features, &[_]Feature{
13671160 .code_object_v3,
13681161 .ldsbankcount16,
13691162 .no_xnack_support,
......@@ -1373,7 +1166,7 @@ pub const cpu = struct {
13731166 pub const kaveri = Cpu{
13741167 .name = "kaveri",
13751168 .llvm_name = "kaveri",
1376 .features = featureSet(&[_]Feature{
1169 .features = featureSet(&all_features, &[_]Feature{
13771170 .code_object_v3,
13781171 .ldsbankcount32,
13791172 .no_xnack_support,
......@@ -1383,7 +1176,7 @@ pub const cpu = struct {
13831176 pub const mullins = Cpu{
13841177 .name = "mullins",
13851178 .llvm_name = "mullins",
1386 .features = featureSet(&[_]Feature{
1179 .features = featureSet(&all_features, &[_]Feature{
13871180 .code_object_v3,
13881181 .ldsbankcount16,
13891182 .no_xnack_support,
......@@ -1393,7 +1186,7 @@ pub const cpu = struct {
13931186 pub const oland = Cpu{
13941187 .name = "oland",
13951188 .llvm_name = "oland",
1396 .features = featureSet(&[_]Feature{
1189 .features = featureSet(&all_features, &[_]Feature{
13971190 .code_object_v3,
13981191 .ldsbankcount32,
13991192 .no_xnack_support,
......@@ -1403,7 +1196,7 @@ pub const cpu = struct {
14031196 pub const pitcairn = Cpu{
14041197 .name = "pitcairn",
14051198 .llvm_name = "pitcairn",
1406 .features = featureSet(&[_]Feature{
1199 .features = featureSet(&all_features, &[_]Feature{
14071200 .code_object_v3,
14081201 .ldsbankcount32,
14091202 .no_xnack_support,
......@@ -1413,7 +1206,7 @@ pub const cpu = struct {
14131206 pub const polaris10 = Cpu{
14141207 .name = "polaris10",
14151208 .llvm_name = "polaris10",
1416 .features = featureSet(&[_]Feature{
1209 .features = featureSet(&all_features, &[_]Feature{
14171210 .code_object_v3,
14181211 .ldsbankcount32,
14191212 .no_xnack_support,
......@@ -1424,7 +1217,7 @@ pub const cpu = struct {
14241217 pub const polaris11 = Cpu{
14251218 .name = "polaris11",
14261219 .llvm_name = "polaris11",
1427 .features = featureSet(&[_]Feature{
1220 .features = featureSet(&all_features, &[_]Feature{
14281221 .code_object_v3,
14291222 .ldsbankcount32,
14301223 .no_xnack_support,
......@@ -1435,7 +1228,7 @@ pub const cpu = struct {
14351228 pub const stoney = Cpu{
14361229 .name = "stoney",
14371230 .llvm_name = "stoney",
1438 .features = featureSet(&[_]Feature{
1231 .features = featureSet(&all_features, &[_]Feature{
14391232 .code_object_v3,
14401233 .ldsbankcount16,
14411234 .volcanic_islands,
......@@ -1445,7 +1238,7 @@ pub const cpu = struct {
14451238 pub const tahiti = Cpu{
14461239 .name = "tahiti",
14471240 .llvm_name = "tahiti",
1448 .features = featureSet(&[_]Feature{
1241 .features = featureSet(&all_features, &[_]Feature{
14491242 .code_object_v3,
14501243 .fast_fmaf,
14511244 .half_rate_64_ops,
......@@ -1457,7 +1250,7 @@ pub const cpu = struct {
14571250 pub const tonga = Cpu{
14581251 .name = "tonga",
14591252 .llvm_name = "tonga",
1460 .features = featureSet(&[_]Feature{
1253 .features = featureSet(&all_features, &[_]Feature{
14611254 .code_object_v3,
14621255 .ldsbankcount32,
14631256 .no_xnack_support,
......@@ -1469,7 +1262,7 @@ pub const cpu = struct {
14691262 pub const verde = Cpu{
14701263 .name = "verde",
14711264 .llvm_name = "verde",
1472 .features = featureSet(&[_]Feature{
1265 .features = featureSet(&all_features, &[_]Feature{
14731266 .code_object_v3,
14741267 .ldsbankcount32,
14751268 .no_xnack_support,
lib/std/target/arm.zig+265-606
......@@ -181,245 +181,182 @@ pub const Feature = enum {
181181pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
182182
183183pub const all_features = blk: {
184 @setEvalBranchQuota(10000);
184185 const len = @typeInfo(Feature).Enum.fields.len;
185 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
186 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
186187 var result: [len]Cpu.Feature = undefined;
187188 result[@enumToInt(Feature.@"32bit")] = .{
188 .index = @enumToInt(Feature.@"32bit"),
189 .name = @tagName(Feature.@"32bit"),
190189 .llvm_name = "32bit",
191190 .description = "Prefer 32-bit Thumb instrs",
192 .dependencies = featureSet(&[_]Feature{}),
191 .dependencies = sparseFeatureSet(&[_]Feature{}),
193192 };
194193 result[@enumToInt(Feature.@"8msecext")] = .{
195 .index = @enumToInt(Feature.@"8msecext"),
196 .name = @tagName(Feature.@"8msecext"),
197194 .llvm_name = "8msecext",
198195 .description = "Enable support for ARMv8-M Security Extensions",
199 .dependencies = featureSet(&[_]Feature{}),
196 .dependencies = sparseFeatureSet(&[_]Feature{}),
200197 };
201198 result[@enumToInt(Feature.a12)] = .{
202 .index = @enumToInt(Feature.a12),
203 .name = @tagName(Feature.a12),
204199 .llvm_name = "a12",
205200 .description = "Cortex-A12 ARM processors",
206 .dependencies = featureSet(&[_]Feature{}),
201 .dependencies = sparseFeatureSet(&[_]Feature{}),
207202 };
208203 result[@enumToInt(Feature.a15)] = .{
209 .index = @enumToInt(Feature.a15),
210 .name = @tagName(Feature.a15),
211204 .llvm_name = "a15",
212205 .description = "Cortex-A15 ARM processors",
213 .dependencies = featureSet(&[_]Feature{}),
206 .dependencies = sparseFeatureSet(&[_]Feature{}),
214207 };
215208 result[@enumToInt(Feature.a17)] = .{
216 .index = @enumToInt(Feature.a17),
217 .name = @tagName(Feature.a17),
218209 .llvm_name = "a17",
219210 .description = "Cortex-A17 ARM processors",
220 .dependencies = featureSet(&[_]Feature{}),
211 .dependencies = sparseFeatureSet(&[_]Feature{}),
221212 };
222213 result[@enumToInt(Feature.a32)] = .{
223 .index = @enumToInt(Feature.a32),
224 .name = @tagName(Feature.a32),
225214 .llvm_name = "a32",
226215 .description = "Cortex-A32 ARM processors",
227 .dependencies = featureSet(&[_]Feature{}),
216 .dependencies = sparseFeatureSet(&[_]Feature{}),
228217 };
229218 result[@enumToInt(Feature.a35)] = .{
230 .index = @enumToInt(Feature.a35),
231 .name = @tagName(Feature.a35),
232219 .llvm_name = "a35",
233220 .description = "Cortex-A35 ARM processors",
234 .dependencies = featureSet(&[_]Feature{}),
221 .dependencies = sparseFeatureSet(&[_]Feature{}),
235222 };
236223 result[@enumToInt(Feature.a5)] = .{
237 .index = @enumToInt(Feature.a5),
238 .name = @tagName(Feature.a5),
239224 .llvm_name = "a5",
240225 .description = "Cortex-A5 ARM processors",
241 .dependencies = featureSet(&[_]Feature{}),
226 .dependencies = sparseFeatureSet(&[_]Feature{}),
242227 };
243228 result[@enumToInt(Feature.a53)] = .{
244 .index = @enumToInt(Feature.a53),
245 .name = @tagName(Feature.a53),
246229 .llvm_name = "a53",
247230 .description = "Cortex-A53 ARM processors",
248 .dependencies = featureSet(&[_]Feature{}),
231 .dependencies = sparseFeatureSet(&[_]Feature{}),
249232 };
250233 result[@enumToInt(Feature.a55)] = .{
251 .index = @enumToInt(Feature.a55),
252 .name = @tagName(Feature.a55),
253234 .llvm_name = "a55",
254235 .description = "Cortex-A55 ARM processors",
255 .dependencies = featureSet(&[_]Feature{}),
236 .dependencies = sparseFeatureSet(&[_]Feature{}),
256237 };
257238 result[@enumToInt(Feature.a57)] = .{
258 .index = @enumToInt(Feature.a57),
259 .name = @tagName(Feature.a57),
260239 .llvm_name = "a57",
261240 .description = "Cortex-A57 ARM processors",
262 .dependencies = featureSet(&[_]Feature{}),
241 .dependencies = sparseFeatureSet(&[_]Feature{}),
263242 };
264243 result[@enumToInt(Feature.a7)] = .{
265 .index = @enumToInt(Feature.a7),
266 .name = @tagName(Feature.a7),
267244 .llvm_name = "a7",
268245 .description = "Cortex-A7 ARM processors",
269 .dependencies = featureSet(&[_]Feature{}),
246 .dependencies = sparseFeatureSet(&[_]Feature{}),
270247 };
271248 result[@enumToInt(Feature.a72)] = .{
272 .index = @enumToInt(Feature.a72),
273 .name = @tagName(Feature.a72),
274249 .llvm_name = "a72",
275250 .description = "Cortex-A72 ARM processors",
276 .dependencies = featureSet(&[_]Feature{}),
251 .dependencies = sparseFeatureSet(&[_]Feature{}),
277252 };
278253 result[@enumToInt(Feature.a73)] = .{
279 .index = @enumToInt(Feature.a73),
280 .name = @tagName(Feature.a73),
281254 .llvm_name = "a73",
282255 .description = "Cortex-A73 ARM processors",
283 .dependencies = featureSet(&[_]Feature{}),
256 .dependencies = sparseFeatureSet(&[_]Feature{}),
284257 };
285258 result[@enumToInt(Feature.a75)] = .{
286 .index = @enumToInt(Feature.a75),
287 .name = @tagName(Feature.a75),
288259 .llvm_name = "a75",
289260 .description = "Cortex-A75 ARM processors",
290 .dependencies = featureSet(&[_]Feature{}),
261 .dependencies = sparseFeatureSet(&[_]Feature{}),
291262 };
292263 result[@enumToInt(Feature.a76)] = .{
293 .index = @enumToInt(Feature.a76),
294 .name = @tagName(Feature.a76),
295264 .llvm_name = "a76",
296265 .description = "Cortex-A76 ARM processors",
297 .dependencies = featureSet(&[_]Feature{}),
266 .dependencies = sparseFeatureSet(&[_]Feature{}),
298267 };
299268 result[@enumToInt(Feature.a8)] = .{
300 .index = @enumToInt(Feature.a8),
301 .name = @tagName(Feature.a8),
302269 .llvm_name = "a8",
303270 .description = "Cortex-A8 ARM processors",
304 .dependencies = featureSet(&[_]Feature{}),
271 .dependencies = sparseFeatureSet(&[_]Feature{}),
305272 };
306273 result[@enumToInt(Feature.a9)] = .{
307 .index = @enumToInt(Feature.a9),
308 .name = @tagName(Feature.a9),
309274 .llvm_name = "a9",
310275 .description = "Cortex-A9 ARM processors",
311 .dependencies = featureSet(&[_]Feature{}),
276 .dependencies = sparseFeatureSet(&[_]Feature{}),
312277 };
313278 result[@enumToInt(Feature.aclass)] = .{
314 .index = @enumToInt(Feature.aclass),
315 .name = @tagName(Feature.aclass),
316279 .llvm_name = "aclass",
317280 .description = "Is application profile ('A' series)",
318 .dependencies = featureSet(&[_]Feature{}),
281 .dependencies = sparseFeatureSet(&[_]Feature{}),
319282 };
320283 result[@enumToInt(Feature.acquire_release)] = .{
321 .index = @enumToInt(Feature.acquire_release),
322 .name = @tagName(Feature.acquire_release),
323284 .llvm_name = "acquire-release",
324285 .description = "Has v8 acquire/release (lda/ldaex etc) instructions",
325 .dependencies = featureSet(&[_]Feature{}),
286 .dependencies = sparseFeatureSet(&[_]Feature{}),
326287 };
327288 result[@enumToInt(Feature.aes)] = .{
328 .index = @enumToInt(Feature.aes),
329 .name = @tagName(Feature.aes),
330289 .llvm_name = "aes",
331290 .description = "Enable AES support",
332 .dependencies = featureSet(&[_]Feature{
291 .dependencies = sparseFeatureSet(&[_]Feature{
333292 .neon,
334293 }),
335294 };
336295 result[@enumToInt(Feature.armv2)] = .{
337 .index = @enumToInt(Feature.armv2),
338 .name = @tagName(Feature.armv2),
339296 .llvm_name = "armv2",
340297 .description = "ARMv2 architecture",
341 .dependencies = featureSet(&[_]Feature{}),
298 .dependencies = sparseFeatureSet(&[_]Feature{}),
342299 };
343300 result[@enumToInt(Feature.armv2a)] = .{
344 .index = @enumToInt(Feature.armv2a),
345 .name = @tagName(Feature.armv2a),
346301 .llvm_name = "armv2a",
347302 .description = "ARMv2a architecture",
348 .dependencies = featureSet(&[_]Feature{}),
303 .dependencies = sparseFeatureSet(&[_]Feature{}),
349304 };
350305 result[@enumToInt(Feature.armv3)] = .{
351 .index = @enumToInt(Feature.armv3),
352 .name = @tagName(Feature.armv3),
353306 .llvm_name = "armv3",
354307 .description = "ARMv3 architecture",
355 .dependencies = featureSet(&[_]Feature{}),
308 .dependencies = sparseFeatureSet(&[_]Feature{}),
356309 };
357310 result[@enumToInt(Feature.armv3m)] = .{
358 .index = @enumToInt(Feature.armv3m),
359 .name = @tagName(Feature.armv3m),
360311 .llvm_name = "armv3m",
361312 .description = "ARMv3m architecture",
362 .dependencies = featureSet(&[_]Feature{}),
313 .dependencies = sparseFeatureSet(&[_]Feature{}),
363314 };
364315 result[@enumToInt(Feature.armv4)] = .{
365 .index = @enumToInt(Feature.armv4),
366 .name = @tagName(Feature.armv4),
367316 .llvm_name = "armv4",
368317 .description = "ARMv4 architecture",
369 .dependencies = featureSet(&[_]Feature{}),
318 .dependencies = sparseFeatureSet(&[_]Feature{}),
370319 };
371320 result[@enumToInt(Feature.armv4t)] = .{
372 .index = @enumToInt(Feature.armv4t),
373 .name = @tagName(Feature.armv4t),
374321 .llvm_name = "armv4t",
375322 .description = "ARMv4t architecture",
376 .dependencies = featureSet(&[_]Feature{
323 .dependencies = sparseFeatureSet(&[_]Feature{
377324 .v4t,
378325 }),
379326 };
380327 result[@enumToInt(Feature.armv5t)] = .{
381 .index = @enumToInt(Feature.armv5t),
382 .name = @tagName(Feature.armv5t),
383328 .llvm_name = "armv5t",
384329 .description = "ARMv5t architecture",
385 .dependencies = featureSet(&[_]Feature{
330 .dependencies = sparseFeatureSet(&[_]Feature{
386331 .v5t,
387332 }),
388333 };
389334 result[@enumToInt(Feature.armv5te)] = .{
390 .index = @enumToInt(Feature.armv5te),
391 .name = @tagName(Feature.armv5te),
392335 .llvm_name = "armv5te",
393336 .description = "ARMv5te architecture",
394 .dependencies = featureSet(&[_]Feature{
337 .dependencies = sparseFeatureSet(&[_]Feature{
395338 .v5te,
396339 }),
397340 };
398341 result[@enumToInt(Feature.armv5tej)] = .{
399 .index = @enumToInt(Feature.armv5tej),
400 .name = @tagName(Feature.armv5tej),
401342 .llvm_name = "armv5tej",
402343 .description = "ARMv5tej architecture",
403 .dependencies = featureSet(&[_]Feature{
344 .dependencies = sparseFeatureSet(&[_]Feature{
404345 .v5te,
405346 }),
406347 };
407348 result[@enumToInt(Feature.armv6)] = .{
408 .index = @enumToInt(Feature.armv6),
409 .name = @tagName(Feature.armv6),
410349 .llvm_name = "armv6",
411350 .description = "ARMv6 architecture",
412 .dependencies = featureSet(&[_]Feature{
351 .dependencies = sparseFeatureSet(&[_]Feature{
413352 .dsp,
414353 .v6,
415354 }),
416355 };
417356 result[@enumToInt(Feature.armv6_m)] = .{
418 .index = @enumToInt(Feature.armv6_m),
419 .name = @tagName(Feature.armv6_m),
420357 .llvm_name = "armv6-m",
421358 .description = "ARMv6m architecture",
422 .dependencies = featureSet(&[_]Feature{
359 .dependencies = sparseFeatureSet(&[_]Feature{
423360 .db,
424361 .mclass,
425362 .noarm,
......@@ -429,39 +366,31 @@ pub const all_features = blk: {
429366 }),
430367 };
431368 result[@enumToInt(Feature.armv6j)] = .{
432 .index = @enumToInt(Feature.armv6j),
433 .name = @tagName(Feature.armv6j),
434369 .llvm_name = "armv6j",
435370 .description = "ARMv7a architecture",
436 .dependencies = featureSet(&[_]Feature{
371 .dependencies = sparseFeatureSet(&[_]Feature{
437372 .armv6,
438373 }),
439374 };
440375 result[@enumToInt(Feature.armv6k)] = .{
441 .index = @enumToInt(Feature.armv6k),
442 .name = @tagName(Feature.armv6k),
443376 .llvm_name = "armv6k",
444377 .description = "ARMv6k architecture",
445 .dependencies = featureSet(&[_]Feature{
378 .dependencies = sparseFeatureSet(&[_]Feature{
446379 .v6k,
447380 }),
448381 };
449382 result[@enumToInt(Feature.armv6kz)] = .{
450 .index = @enumToInt(Feature.armv6kz),
451 .name = @tagName(Feature.armv6kz),
452383 .llvm_name = "armv6kz",
453384 .description = "ARMv6kz architecture",
454 .dependencies = featureSet(&[_]Feature{
385 .dependencies = sparseFeatureSet(&[_]Feature{
455386 .trustzone,
456387 .v6k,
457388 }),
458389 };
459390 result[@enumToInt(Feature.armv6s_m)] = .{
460 .index = @enumToInt(Feature.armv6s_m),
461 .name = @tagName(Feature.armv6s_m),
462391 .llvm_name = "armv6s-m",
463392 .description = "ARMv6sm architecture",
464 .dependencies = featureSet(&[_]Feature{
393 .dependencies = sparseFeatureSet(&[_]Feature{
465394 .db,
466395 .mclass,
467396 .noarm,
......@@ -471,21 +400,17 @@ pub const all_features = blk: {
471400 }),
472401 };
473402 result[@enumToInt(Feature.armv6t2)] = .{
474 .index = @enumToInt(Feature.armv6t2),
475 .name = @tagName(Feature.armv6t2),
476403 .llvm_name = "armv6t2",
477404 .description = "ARMv6t2 architecture",
478 .dependencies = featureSet(&[_]Feature{
405 .dependencies = sparseFeatureSet(&[_]Feature{
479406 .dsp,
480407 .v6t2,
481408 }),
482409 };
483410 result[@enumToInt(Feature.armv7_a)] = .{
484 .index = @enumToInt(Feature.armv7_a),
485 .name = @tagName(Feature.armv7_a),
486411 .llvm_name = "armv7-a",
487412 .description = "ARMv7a architecture",
488 .dependencies = featureSet(&[_]Feature{
413 .dependencies = sparseFeatureSet(&[_]Feature{
489414 .aclass,
490415 .db,
491416 .dsp,
......@@ -494,11 +419,9 @@ pub const all_features = blk: {
494419 }),
495420 };
496421 result[@enumToInt(Feature.armv7_m)] = .{
497 .index = @enumToInt(Feature.armv7_m),
498 .name = @tagName(Feature.armv7_m),
499422 .llvm_name = "armv7-m",
500423 .description = "ARMv7m architecture",
501 .dependencies = featureSet(&[_]Feature{
424 .dependencies = sparseFeatureSet(&[_]Feature{
502425 .db,
503426 .hwdiv,
504427 .mclass,
......@@ -509,11 +432,9 @@ pub const all_features = blk: {
509432 }),
510433 };
511434 result[@enumToInt(Feature.armv7_r)] = .{
512 .index = @enumToInt(Feature.armv7_r),
513 .name = @tagName(Feature.armv7_r),
514435 .llvm_name = "armv7-r",
515436 .description = "ARMv7r architecture",
516 .dependencies = featureSet(&[_]Feature{
437 .dependencies = sparseFeatureSet(&[_]Feature{
517438 .db,
518439 .dsp,
519440 .hwdiv,
......@@ -522,11 +443,9 @@ pub const all_features = blk: {
522443 }),
523444 };
524445 result[@enumToInt(Feature.armv7e_m)] = .{
525 .index = @enumToInt(Feature.armv7e_m),
526 .name = @tagName(Feature.armv7e_m),
527446 .llvm_name = "armv7e-m",
528447 .description = "ARMv7em architecture",
529 .dependencies = featureSet(&[_]Feature{
448 .dependencies = sparseFeatureSet(&[_]Feature{
530449 .db,
531450 .dsp,
532451 .hwdiv,
......@@ -538,29 +457,23 @@ pub const all_features = blk: {
538457 }),
539458 };
540459 result[@enumToInt(Feature.armv7k)] = .{
541 .index = @enumToInt(Feature.armv7k),
542 .name = @tagName(Feature.armv7k),
543460 .llvm_name = "armv7k",
544461 .description = "ARMv7a architecture",
545 .dependencies = featureSet(&[_]Feature{
462 .dependencies = sparseFeatureSet(&[_]Feature{
546463 .armv7_a,
547464 }),
548465 };
549466 result[@enumToInt(Feature.armv7s)] = .{
550 .index = @enumToInt(Feature.armv7s),
551 .name = @tagName(Feature.armv7s),
552467 .llvm_name = "armv7s",
553468 .description = "ARMv7a architecture",
554 .dependencies = featureSet(&[_]Feature{
469 .dependencies = sparseFeatureSet(&[_]Feature{
555470 .armv7_a,
556471 }),
557472 };
558473 result[@enumToInt(Feature.armv7ve)] = .{
559 .index = @enumToInt(Feature.armv7ve),
560 .name = @tagName(Feature.armv7ve),
561474 .llvm_name = "armv7ve",
562475 .description = "ARMv7ve architecture",
563 .dependencies = featureSet(&[_]Feature{
476 .dependencies = sparseFeatureSet(&[_]Feature{
564477 .aclass,
565478 .db,
566479 .dsp,
......@@ -572,11 +485,9 @@ pub const all_features = blk: {
572485 }),
573486 };
574487 result[@enumToInt(Feature.armv8_a)] = .{
575 .index = @enumToInt(Feature.armv8_a),
576 .name = @tagName(Feature.armv8_a),
577488 .llvm_name = "armv8-a",
578489 .description = "ARMv8a architecture",
579 .dependencies = featureSet(&[_]Feature{
490 .dependencies = sparseFeatureSet(&[_]Feature{
580491 .aclass,
581492 .crc,
582493 .crypto,
......@@ -591,11 +502,9 @@ pub const all_features = blk: {
591502 }),
592503 };
593504 result[@enumToInt(Feature.armv8_m_base)] = .{
594 .index = @enumToInt(Feature.armv8_m_base),
595 .name = @tagName(Feature.armv8_m_base),
596505 .llvm_name = "armv8-m.base",
597506 .description = "ARMv8mBaseline architecture",
598 .dependencies = featureSet(&[_]Feature{
507 .dependencies = sparseFeatureSet(&[_]Feature{
599508 .@"8msecext",
600509 .acquire_release,
601510 .db,
......@@ -609,11 +518,9 @@ pub const all_features = blk: {
609518 }),
610519 };
611520 result[@enumToInt(Feature.armv8_m_main)] = .{
612 .index = @enumToInt(Feature.armv8_m_main),
613 .name = @tagName(Feature.armv8_m_main),
614521 .llvm_name = "armv8-m.main",
615522 .description = "ARMv8mMainline architecture",
616 .dependencies = featureSet(&[_]Feature{
523 .dependencies = sparseFeatureSet(&[_]Feature{
617524 .@"8msecext",
618525 .acquire_release,
619526 .db,
......@@ -625,11 +532,9 @@ pub const all_features = blk: {
625532 }),
626533 };
627534 result[@enumToInt(Feature.armv8_r)] = .{
628 .index = @enumToInt(Feature.armv8_r),
629 .name = @tagName(Feature.armv8_r),
630535 .llvm_name = "armv8-r",
631536 .description = "ARMv8r architecture",
632 .dependencies = featureSet(&[_]Feature{
537 .dependencies = sparseFeatureSet(&[_]Feature{
633538 .crc,
634539 .db,
635540 .dfb,
......@@ -643,11 +548,9 @@ pub const all_features = blk: {
643548 }),
644549 };
645550 result[@enumToInt(Feature.armv8_1_a)] = .{
646 .index = @enumToInt(Feature.armv8_1_a),
647 .name = @tagName(Feature.armv8_1_a),
648551 .llvm_name = "armv8.1-a",
649552 .description = "ARMv81a architecture",
650 .dependencies = featureSet(&[_]Feature{
553 .dependencies = sparseFeatureSet(&[_]Feature{
651554 .aclass,
652555 .crc,
653556 .crypto,
......@@ -662,11 +565,9 @@ pub const all_features = blk: {
662565 }),
663566 };
664567 result[@enumToInt(Feature.armv8_1_m_main)] = .{
665 .index = @enumToInt(Feature.armv8_1_m_main),
666 .name = @tagName(Feature.armv8_1_m_main),
667568 .llvm_name = "armv8.1-m.main",
668569 .description = "ARMv81mMainline architecture",
669 .dependencies = featureSet(&[_]Feature{
570 .dependencies = sparseFeatureSet(&[_]Feature{
670571 .@"8msecext",
671572 .acquire_release,
672573 .db,
......@@ -680,11 +581,9 @@ pub const all_features = blk: {
680581 }),
681582 };
682583 result[@enumToInt(Feature.armv8_2_a)] = .{
683 .index = @enumToInt(Feature.armv8_2_a),
684 .name = @tagName(Feature.armv8_2_a),
685584 .llvm_name = "armv8.2-a",
686585 .description = "ARMv82a architecture",
687 .dependencies = featureSet(&[_]Feature{
586 .dependencies = sparseFeatureSet(&[_]Feature{
688587 .aclass,
689588 .crc,
690589 .crypto,
......@@ -700,11 +599,9 @@ pub const all_features = blk: {
700599 }),
701600 };
702601 result[@enumToInt(Feature.armv8_3_a)] = .{
703 .index = @enumToInt(Feature.armv8_3_a),
704 .name = @tagName(Feature.armv8_3_a),
705602 .llvm_name = "armv8.3-a",
706603 .description = "ARMv83a architecture",
707 .dependencies = featureSet(&[_]Feature{
604 .dependencies = sparseFeatureSet(&[_]Feature{
708605 .aclass,
709606 .crc,
710607 .crypto,
......@@ -720,11 +617,9 @@ pub const all_features = blk: {
720617 }),
721618 };
722619 result[@enumToInt(Feature.armv8_4_a)] = .{
723 .index = @enumToInt(Feature.armv8_4_a),
724 .name = @tagName(Feature.armv8_4_a),
725620 .llvm_name = "armv8.4-a",
726621 .description = "ARMv84a architecture",
727 .dependencies = featureSet(&[_]Feature{
622 .dependencies = sparseFeatureSet(&[_]Feature{
728623 .aclass,
729624 .crc,
730625 .crypto,
......@@ -741,11 +636,9 @@ pub const all_features = blk: {
741636 }),
742637 };
743638 result[@enumToInt(Feature.armv8_5_a)] = .{
744 .index = @enumToInt(Feature.armv8_5_a),
745 .name = @tagName(Feature.armv8_5_a),
746639 .llvm_name = "armv8.5-a",
747640 .description = "ARMv85a architecture",
748 .dependencies = featureSet(&[_]Feature{
641 .dependencies = sparseFeatureSet(&[_]Feature{
749642 .aclass,
750643 .crc,
751644 .crypto,
......@@ -762,115 +655,85 @@ pub const all_features = blk: {
762655 }),
763656 };
764657 result[@enumToInt(Feature.avoid_movs_shop)] = .{
765 .index = @enumToInt(Feature.avoid_movs_shop),
766 .name = @tagName(Feature.avoid_movs_shop),
767658 .llvm_name = "avoid-movs-shop",
768659 .description = "Avoid movs instructions with shifter operand",
769 .dependencies = featureSet(&[_]Feature{}),
660 .dependencies = sparseFeatureSet(&[_]Feature{}),
770661 };
771662 result[@enumToInt(Feature.avoid_partial_cpsr)] = .{
772 .index = @enumToInt(Feature.avoid_partial_cpsr),
773 .name = @tagName(Feature.avoid_partial_cpsr),
774663 .llvm_name = "avoid-partial-cpsr",
775664 .description = "Avoid CPSR partial update for OOO execution",
776 .dependencies = featureSet(&[_]Feature{}),
665 .dependencies = sparseFeatureSet(&[_]Feature{}),
777666 };
778667 result[@enumToInt(Feature.cheap_predicable_cpsr)] = .{
779 .index = @enumToInt(Feature.cheap_predicable_cpsr),
780 .name = @tagName(Feature.cheap_predicable_cpsr),
781668 .llvm_name = "cheap-predicable-cpsr",
782669 .description = "Disable +1 predication cost for instructions updating CPSR",
783 .dependencies = featureSet(&[_]Feature{}),
670 .dependencies = sparseFeatureSet(&[_]Feature{}),
784671 };
785672 result[@enumToInt(Feature.crc)] = .{
786 .index = @enumToInt(Feature.crc),
787 .name = @tagName(Feature.crc),
788673 .llvm_name = "crc",
789674 .description = "Enable support for CRC instructions",
790 .dependencies = featureSet(&[_]Feature{}),
675 .dependencies = sparseFeatureSet(&[_]Feature{}),
791676 };
792677 result[@enumToInt(Feature.crypto)] = .{
793 .index = @enumToInt(Feature.crypto),
794 .name = @tagName(Feature.crypto),
795678 .llvm_name = "crypto",
796679 .description = "Enable support for Cryptography extensions",
797 .dependencies = featureSet(&[_]Feature{
680 .dependencies = sparseFeatureSet(&[_]Feature{
798681 .aes,
799682 .neon,
800683 .sha2,
801684 }),
802685 };
803686 result[@enumToInt(Feature.d32)] = .{
804 .index = @enumToInt(Feature.d32),
805 .name = @tagName(Feature.d32),
806687 .llvm_name = "d32",
807688 .description = "Extend FP to 32 double registers",
808 .dependencies = featureSet(&[_]Feature{}),
689 .dependencies = sparseFeatureSet(&[_]Feature{}),
809690 };
810691 result[@enumToInt(Feature.db)] = .{
811 .index = @enumToInt(Feature.db),
812 .name = @tagName(Feature.db),
813692 .llvm_name = "db",
814693 .description = "Has data barrier (dmb/dsb) instructions",
815 .dependencies = featureSet(&[_]Feature{}),
694 .dependencies = sparseFeatureSet(&[_]Feature{}),
816695 };
817696 result[@enumToInt(Feature.dfb)] = .{
818 .index = @enumToInt(Feature.dfb),
819 .name = @tagName(Feature.dfb),
820697 .llvm_name = "dfb",
821698 .description = "Has full data barrier (dfb) instruction",
822 .dependencies = featureSet(&[_]Feature{}),
699 .dependencies = sparseFeatureSet(&[_]Feature{}),
823700 };
824701 result[@enumToInt(Feature.disable_postra_scheduler)] = .{
825 .index = @enumToInt(Feature.disable_postra_scheduler),
826 .name = @tagName(Feature.disable_postra_scheduler),
827702 .llvm_name = "disable-postra-scheduler",
828703 .description = "Don't schedule again after register allocation",
829 .dependencies = featureSet(&[_]Feature{}),
704 .dependencies = sparseFeatureSet(&[_]Feature{}),
830705 };
831706 result[@enumToInt(Feature.dont_widen_vmovs)] = .{
832 .index = @enumToInt(Feature.dont_widen_vmovs),
833 .name = @tagName(Feature.dont_widen_vmovs),
834707 .llvm_name = "dont-widen-vmovs",
835708 .description = "Don't widen VMOVS to VMOVD",
836 .dependencies = featureSet(&[_]Feature{}),
709 .dependencies = sparseFeatureSet(&[_]Feature{}),
837710 };
838711 result[@enumToInt(Feature.dotprod)] = .{
839 .index = @enumToInt(Feature.dotprod),
840 .name = @tagName(Feature.dotprod),
841712 .llvm_name = "dotprod",
842713 .description = "Enable support for dot product instructions",
843 .dependencies = featureSet(&[_]Feature{
714 .dependencies = sparseFeatureSet(&[_]Feature{
844715 .neon,
845716 }),
846717 };
847718 result[@enumToInt(Feature.dsp)] = .{
848 .index = @enumToInt(Feature.dsp),
849 .name = @tagName(Feature.dsp),
850719 .llvm_name = "dsp",
851720 .description = "Supports DSP instructions in ARM and/or Thumb2",
852 .dependencies = featureSet(&[_]Feature{}),
721 .dependencies = sparseFeatureSet(&[_]Feature{}),
853722 };
854723 result[@enumToInt(Feature.execute_only)] = .{
855 .index = @enumToInt(Feature.execute_only),
856 .name = @tagName(Feature.execute_only),
857724 .llvm_name = "execute-only",
858725 .description = "Enable the generation of execute only code.",
859 .dependencies = featureSet(&[_]Feature{}),
726 .dependencies = sparseFeatureSet(&[_]Feature{}),
860727 };
861728 result[@enumToInt(Feature.expand_fp_mlx)] = .{
862 .index = @enumToInt(Feature.expand_fp_mlx),
863 .name = @tagName(Feature.expand_fp_mlx),
864729 .llvm_name = "expand-fp-mlx",
865730 .description = "Expand VFP/NEON MLA/MLS instructions",
866 .dependencies = featureSet(&[_]Feature{}),
731 .dependencies = sparseFeatureSet(&[_]Feature{}),
867732 };
868733 result[@enumToInt(Feature.exynos)] = .{
869 .index = @enumToInt(Feature.exynos),
870 .name = @tagName(Feature.exynos),
871734 .llvm_name = "exynos",
872735 .description = "Samsung Exynos processors",
873 .dependencies = featureSet(&[_]Feature{
736 .dependencies = sparseFeatureSet(&[_]Feature{
874737 .crc,
875738 .crypto,
876739 .expand_fp_mlx,
......@@ -891,229 +754,173 @@ pub const all_features = blk: {
891754 }),
892755 };
893756 result[@enumToInt(Feature.fp_armv8)] = .{
894 .index = @enumToInt(Feature.fp_armv8),
895 .name = @tagName(Feature.fp_armv8),
896757 .llvm_name = "fp-armv8",
897758 .description = "Enable ARMv8 FP",
898 .dependencies = featureSet(&[_]Feature{
759 .dependencies = sparseFeatureSet(&[_]Feature{
899760 .fp_armv8d16,
900761 .fp_armv8sp,
901762 .vfp4,
902763 }),
903764 };
904765 result[@enumToInt(Feature.fp_armv8d16)] = .{
905 .index = @enumToInt(Feature.fp_armv8d16),
906 .name = @tagName(Feature.fp_armv8d16),
907766 .llvm_name = "fp-armv8d16",
908767 .description = "Enable ARMv8 FP with only 16 d-registers",
909 .dependencies = featureSet(&[_]Feature{
768 .dependencies = sparseFeatureSet(&[_]Feature{
910769 .fp_armv8d16sp,
911770 .fp64,
912771 .vfp4d16,
913772 }),
914773 };
915774 result[@enumToInt(Feature.fp_armv8d16sp)] = .{
916 .index = @enumToInt(Feature.fp_armv8d16sp),
917 .name = @tagName(Feature.fp_armv8d16sp),
918775 .llvm_name = "fp-armv8d16sp",
919776 .description = "Enable ARMv8 FP with only 16 d-registers and no double precision",
920 .dependencies = featureSet(&[_]Feature{
777 .dependencies = sparseFeatureSet(&[_]Feature{
921778 .vfp4d16sp,
922779 }),
923780 };
924781 result[@enumToInt(Feature.fp_armv8sp)] = .{
925 .index = @enumToInt(Feature.fp_armv8sp),
926 .name = @tagName(Feature.fp_armv8sp),
927782 .llvm_name = "fp-armv8sp",
928783 .description = "Enable ARMv8 FP with no double precision",
929 .dependencies = featureSet(&[_]Feature{
784 .dependencies = sparseFeatureSet(&[_]Feature{
930785 .d32,
931786 .fp_armv8d16sp,
932787 .vfp4sp,
933788 }),
934789 };
935790 result[@enumToInt(Feature.fp16)] = .{
936 .index = @enumToInt(Feature.fp16),
937 .name = @tagName(Feature.fp16),
938791 .llvm_name = "fp16",
939792 .description = "Enable half-precision floating point",
940 .dependencies = featureSet(&[_]Feature{}),
793 .dependencies = sparseFeatureSet(&[_]Feature{}),
941794 };
942795 result[@enumToInt(Feature.fp16fml)] = .{
943 .index = @enumToInt(Feature.fp16fml),
944 .name = @tagName(Feature.fp16fml),
945796 .llvm_name = "fp16fml",
946797 .description = "Enable full half-precision floating point fml instructions",
947 .dependencies = featureSet(&[_]Feature{
798 .dependencies = sparseFeatureSet(&[_]Feature{
948799 .fullfp16,
949800 }),
950801 };
951802 result[@enumToInt(Feature.fp64)] = .{
952 .index = @enumToInt(Feature.fp64),
953 .name = @tagName(Feature.fp64),
954803 .llvm_name = "fp64",
955804 .description = "Floating point unit supports double precision",
956 .dependencies = featureSet(&[_]Feature{
805 .dependencies = sparseFeatureSet(&[_]Feature{
957806 .fpregs64,
958807 }),
959808 };
960809 result[@enumToInt(Feature.fpao)] = .{
961 .index = @enumToInt(Feature.fpao),
962 .name = @tagName(Feature.fpao),
963810 .llvm_name = "fpao",
964811 .description = "Enable fast computation of positive address offsets",
965 .dependencies = featureSet(&[_]Feature{}),
812 .dependencies = sparseFeatureSet(&[_]Feature{}),
966813 };
967814 result[@enumToInt(Feature.fpregs)] = .{
968 .index = @enumToInt(Feature.fpregs),
969 .name = @tagName(Feature.fpregs),
970815 .llvm_name = "fpregs",
971816 .description = "Enable FP registers",
972 .dependencies = featureSet(&[_]Feature{}),
817 .dependencies = sparseFeatureSet(&[_]Feature{}),
973818 };
974819 result[@enumToInt(Feature.fpregs16)] = .{
975 .index = @enumToInt(Feature.fpregs16),
976 .name = @tagName(Feature.fpregs16),
977820 .llvm_name = "fpregs16",
978821 .description = "Enable 16-bit FP registers",
979 .dependencies = featureSet(&[_]Feature{
822 .dependencies = sparseFeatureSet(&[_]Feature{
980823 .fpregs,
981824 }),
982825 };
983826 result[@enumToInt(Feature.fpregs64)] = .{
984 .index = @enumToInt(Feature.fpregs64),
985 .name = @tagName(Feature.fpregs64),
986827 .llvm_name = "fpregs64",
987828 .description = "Enable 64-bit FP registers",
988 .dependencies = featureSet(&[_]Feature{
829 .dependencies = sparseFeatureSet(&[_]Feature{
989830 .fpregs,
990831 }),
991832 };
992833 result[@enumToInt(Feature.fullfp16)] = .{
993 .index = @enumToInt(Feature.fullfp16),
994 .name = @tagName(Feature.fullfp16),
995834 .llvm_name = "fullfp16",
996835 .description = "Enable full half-precision floating point",
997 .dependencies = featureSet(&[_]Feature{
836 .dependencies = sparseFeatureSet(&[_]Feature{
998837 .fp_armv8d16sp,
999838 .fpregs16,
1000839 }),
1001840 };
1002841 result[@enumToInt(Feature.fuse_aes)] = .{
1003 .index = @enumToInt(Feature.fuse_aes),
1004 .name = @tagName(Feature.fuse_aes),
1005842 .llvm_name = "fuse-aes",
1006843 .description = "CPU fuses AES crypto operations",
1007 .dependencies = featureSet(&[_]Feature{}),
844 .dependencies = sparseFeatureSet(&[_]Feature{}),
1008845 };
1009846 result[@enumToInt(Feature.fuse_literals)] = .{
1010 .index = @enumToInt(Feature.fuse_literals),
1011 .name = @tagName(Feature.fuse_literals),
1012847 .llvm_name = "fuse-literals",
1013848 .description = "CPU fuses literal generation operations",
1014 .dependencies = featureSet(&[_]Feature{}),
849 .dependencies = sparseFeatureSet(&[_]Feature{}),
1015850 };
1016851 result[@enumToInt(Feature.hwdiv)] = .{
1017 .index = @enumToInt(Feature.hwdiv),
1018 .name = @tagName(Feature.hwdiv),
1019852 .llvm_name = "hwdiv",
1020853 .description = "Enable divide instructions in Thumb",
1021 .dependencies = featureSet(&[_]Feature{}),
854 .dependencies = sparseFeatureSet(&[_]Feature{}),
1022855 };
1023856 result[@enumToInt(Feature.hwdiv_arm)] = .{
1024 .index = @enumToInt(Feature.hwdiv_arm),
1025 .name = @tagName(Feature.hwdiv_arm),
1026857 .llvm_name = "hwdiv-arm",
1027858 .description = "Enable divide instructions in ARM mode",
1028 .dependencies = featureSet(&[_]Feature{}),
859 .dependencies = sparseFeatureSet(&[_]Feature{}),
1029860 };
1030861 result[@enumToInt(Feature.iwmmxt)] = .{
1031 .index = @enumToInt(Feature.iwmmxt),
1032 .name = @tagName(Feature.iwmmxt),
1033862 .llvm_name = "iwmmxt",
1034863 .description = "ARMv5te architecture",
1035 .dependencies = featureSet(&[_]Feature{
864 .dependencies = sparseFeatureSet(&[_]Feature{
1036865 .armv5te,
1037866 }),
1038867 };
1039868 result[@enumToInt(Feature.iwmmxt2)] = .{
1040 .index = @enumToInt(Feature.iwmmxt2),
1041 .name = @tagName(Feature.iwmmxt2),
1042869 .llvm_name = "iwmmxt2",
1043870 .description = "ARMv5te architecture",
1044 .dependencies = featureSet(&[_]Feature{
871 .dependencies = sparseFeatureSet(&[_]Feature{
1045872 .armv5te,
1046873 }),
1047874 };
1048875 result[@enumToInt(Feature.krait)] = .{
1049 .index = @enumToInt(Feature.krait),
1050 .name = @tagName(Feature.krait),
1051876 .llvm_name = "krait",
1052877 .description = "Qualcomm Krait processors",
1053 .dependencies = featureSet(&[_]Feature{}),
878 .dependencies = sparseFeatureSet(&[_]Feature{}),
1054879 };
1055880 result[@enumToInt(Feature.kryo)] = .{
1056 .index = @enumToInt(Feature.kryo),
1057 .name = @tagName(Feature.kryo),
1058881 .llvm_name = "kryo",
1059882 .description = "Qualcomm Kryo processors",
1060 .dependencies = featureSet(&[_]Feature{}),
883 .dependencies = sparseFeatureSet(&[_]Feature{}),
1061884 };
1062885 result[@enumToInt(Feature.lob)] = .{
1063 .index = @enumToInt(Feature.lob),
1064 .name = @tagName(Feature.lob),
1065886 .llvm_name = "lob",
1066887 .description = "Enable Low Overhead Branch extensions",
1067 .dependencies = featureSet(&[_]Feature{}),
888 .dependencies = sparseFeatureSet(&[_]Feature{}),
1068889 };
1069890 result[@enumToInt(Feature.long_calls)] = .{
1070 .index = @enumToInt(Feature.long_calls),
1071 .name = @tagName(Feature.long_calls),
1072891 .llvm_name = "long-calls",
1073892 .description = "Generate calls via indirect call instructions",
1074 .dependencies = featureSet(&[_]Feature{}),
893 .dependencies = sparseFeatureSet(&[_]Feature{}),
1075894 };
1076895 result[@enumToInt(Feature.loop_align)] = .{
1077 .index = @enumToInt(Feature.loop_align),
1078 .name = @tagName(Feature.loop_align),
1079896 .llvm_name = "loop-align",
1080897 .description = "Prefer 32-bit alignment for loops",
1081 .dependencies = featureSet(&[_]Feature{}),
898 .dependencies = sparseFeatureSet(&[_]Feature{}),
1082899 };
1083900 result[@enumToInt(Feature.m3)] = .{
1084 .index = @enumToInt(Feature.m3),
1085 .name = @tagName(Feature.m3),
1086901 .llvm_name = "m3",
1087902 .description = "Cortex-M3 ARM processors",
1088 .dependencies = featureSet(&[_]Feature{}),
903 .dependencies = sparseFeatureSet(&[_]Feature{}),
1089904 };
1090905 result[@enumToInt(Feature.mclass)] = .{
1091 .index = @enumToInt(Feature.mclass),
1092 .name = @tagName(Feature.mclass),
1093906 .llvm_name = "mclass",
1094907 .description = "Is microcontroller profile ('M' series)",
1095 .dependencies = featureSet(&[_]Feature{}),
908 .dependencies = sparseFeatureSet(&[_]Feature{}),
1096909 };
1097910 result[@enumToInt(Feature.mp)] = .{
1098 .index = @enumToInt(Feature.mp),
1099 .name = @tagName(Feature.mp),
1100911 .llvm_name = "mp",
1101912 .description = "Supports Multiprocessing extension",
1102 .dependencies = featureSet(&[_]Feature{}),
913 .dependencies = sparseFeatureSet(&[_]Feature{}),
1103914 };
1104915 result[@enumToInt(Feature.muxed_units)] = .{
1105 .index = @enumToInt(Feature.muxed_units),
1106 .name = @tagName(Feature.muxed_units),
1107916 .llvm_name = "muxed-units",
1108917 .description = "Has muxed AGU and NEON/FPU",
1109 .dependencies = featureSet(&[_]Feature{}),
918 .dependencies = sparseFeatureSet(&[_]Feature{}),
1110919 };
1111920 result[@enumToInt(Feature.mve)] = .{
1112 .index = @enumToInt(Feature.mve),
1113 .name = @tagName(Feature.mve),
1114921 .llvm_name = "mve",
1115922 .description = "Support M-Class Vector Extension with integer ops",
1116 .dependencies = featureSet(&[_]Feature{
923 .dependencies = sparseFeatureSet(&[_]Feature{
1117924 .dsp,
1118925 .fpregs16,
1119926 .fpregs64,
......@@ -1121,544 +928,410 @@ pub const all_features = blk: {
1121928 }),
1122929 };
1123930 result[@enumToInt(Feature.mve_fp)] = .{
1124 .index = @enumToInt(Feature.mve_fp),
1125 .name = @tagName(Feature.mve_fp),
1126931 .llvm_name = "mve.fp",
1127932 .description = "Support M-Class Vector Extension with integer and floating ops",
1128 .dependencies = featureSet(&[_]Feature{
933 .dependencies = sparseFeatureSet(&[_]Feature{
1129934 .fp_armv8d16sp,
1130935 .fullfp16,
1131936 .mve,
1132937 }),
1133938 };
1134939 result[@enumToInt(Feature.nacl_trap)] = .{
1135 .index = @enumToInt(Feature.nacl_trap),
1136 .name = @tagName(Feature.nacl_trap),
1137940 .llvm_name = "nacl-trap",
1138941 .description = "NaCl trap",
1139 .dependencies = featureSet(&[_]Feature{}),
942 .dependencies = sparseFeatureSet(&[_]Feature{}),
1140943 };
1141944 result[@enumToInt(Feature.neon)] = .{
1142 .index = @enumToInt(Feature.neon),
1143 .name = @tagName(Feature.neon),
1144945 .llvm_name = "neon",
1145946 .description = "Enable NEON instructions",
1146 .dependencies = featureSet(&[_]Feature{
947 .dependencies = sparseFeatureSet(&[_]Feature{
1147948 .vfp3,
1148949 }),
1149950 };
1150951 result[@enumToInt(Feature.neon_fpmovs)] = .{
1151 .index = @enumToInt(Feature.neon_fpmovs),
1152 .name = @tagName(Feature.neon_fpmovs),
1153952 .llvm_name = "neon-fpmovs",
1154953 .description = "Convert VMOVSR, VMOVRS, VMOVS to NEON",
1155 .dependencies = featureSet(&[_]Feature{}),
954 .dependencies = sparseFeatureSet(&[_]Feature{}),
1156955 };
1157956 result[@enumToInt(Feature.neonfp)] = .{
1158 .index = @enumToInt(Feature.neonfp),
1159 .name = @tagName(Feature.neonfp),
1160957 .llvm_name = "neonfp",
1161958 .description = "Use NEON for single precision FP",
1162 .dependencies = featureSet(&[_]Feature{}),
959 .dependencies = sparseFeatureSet(&[_]Feature{}),
1163960 };
1164961 result[@enumToInt(Feature.no_branch_predictor)] = .{
1165 .index = @enumToInt(Feature.no_branch_predictor),
1166 .name = @tagName(Feature.no_branch_predictor),
1167962 .llvm_name = "no-branch-predictor",
1168963 .description = "Has no branch predictor",
1169 .dependencies = featureSet(&[_]Feature{}),
964 .dependencies = sparseFeatureSet(&[_]Feature{}),
1170965 };
1171966 result[@enumToInt(Feature.no_movt)] = .{
1172 .index = @enumToInt(Feature.no_movt),
1173 .name = @tagName(Feature.no_movt),
1174967 .llvm_name = "no-movt",
1175968 .description = "Don't use movt/movw pairs for 32-bit imms",
1176 .dependencies = featureSet(&[_]Feature{}),
969 .dependencies = sparseFeatureSet(&[_]Feature{}),
1177970 };
1178971 result[@enumToInt(Feature.no_neg_immediates)] = .{
1179 .index = @enumToInt(Feature.no_neg_immediates),
1180 .name = @tagName(Feature.no_neg_immediates),
1181972 .llvm_name = "no-neg-immediates",
1182973 .description = "Convert immediates and instructions to their negated or complemented equivalent when the immediate does not fit in the encoding.",
1183 .dependencies = featureSet(&[_]Feature{}),
974 .dependencies = sparseFeatureSet(&[_]Feature{}),
1184975 };
1185976 result[@enumToInt(Feature.noarm)] = .{
1186 .index = @enumToInt(Feature.noarm),
1187 .name = @tagName(Feature.noarm),
1188977 .llvm_name = "noarm",
1189978 .description = "Does not support ARM mode execution",
1190 .dependencies = featureSet(&[_]Feature{}),
979 .dependencies = sparseFeatureSet(&[_]Feature{}),
1191980 };
1192981 result[@enumToInt(Feature.nonpipelined_vfp)] = .{
1193 .index = @enumToInt(Feature.nonpipelined_vfp),
1194 .name = @tagName(Feature.nonpipelined_vfp),
1195982 .llvm_name = "nonpipelined-vfp",
1196983 .description = "VFP instructions are not pipelined",
1197 .dependencies = featureSet(&[_]Feature{}),
984 .dependencies = sparseFeatureSet(&[_]Feature{}),
1198985 };
1199986 result[@enumToInt(Feature.perfmon)] = .{
1200 .index = @enumToInt(Feature.perfmon),
1201 .name = @tagName(Feature.perfmon),
1202987 .llvm_name = "perfmon",
1203988 .description = "Enable support for Performance Monitor extensions",
1204 .dependencies = featureSet(&[_]Feature{}),
989 .dependencies = sparseFeatureSet(&[_]Feature{}),
1205990 };
1206991 result[@enumToInt(Feature.prefer_ishst)] = .{
1207 .index = @enumToInt(Feature.prefer_ishst),
1208 .name = @tagName(Feature.prefer_ishst),
1209992 .llvm_name = "prefer-ishst",
1210993 .description = "Prefer ISHST barriers",
1211 .dependencies = featureSet(&[_]Feature{}),
994 .dependencies = sparseFeatureSet(&[_]Feature{}),
1212995 };
1213996 result[@enumToInt(Feature.prefer_vmovsr)] = .{
1214 .index = @enumToInt(Feature.prefer_vmovsr),
1215 .name = @tagName(Feature.prefer_vmovsr),
1216997 .llvm_name = "prefer-vmovsr",
1217998 .description = "Prefer VMOVSR",
1218 .dependencies = featureSet(&[_]Feature{}),
999 .dependencies = sparseFeatureSet(&[_]Feature{}),
12191000 };
12201001 result[@enumToInt(Feature.prof_unpr)] = .{
1221 .index = @enumToInt(Feature.prof_unpr),
1222 .name = @tagName(Feature.prof_unpr),
12231002 .llvm_name = "prof-unpr",
12241003 .description = "Is profitable to unpredicate",
1225 .dependencies = featureSet(&[_]Feature{}),
1004 .dependencies = sparseFeatureSet(&[_]Feature{}),
12261005 };
12271006 result[@enumToInt(Feature.r4)] = .{
1228 .index = @enumToInt(Feature.r4),
1229 .name = @tagName(Feature.r4),
12301007 .llvm_name = "r4",
12311008 .description = "Cortex-R4 ARM processors",
1232 .dependencies = featureSet(&[_]Feature{}),
1009 .dependencies = sparseFeatureSet(&[_]Feature{}),
12331010 };
12341011 result[@enumToInt(Feature.r5)] = .{
1235 .index = @enumToInt(Feature.r5),
1236 .name = @tagName(Feature.r5),
12371012 .llvm_name = "r5",
12381013 .description = "Cortex-R5 ARM processors",
1239 .dependencies = featureSet(&[_]Feature{}),
1014 .dependencies = sparseFeatureSet(&[_]Feature{}),
12401015 };
12411016 result[@enumToInt(Feature.r52)] = .{
1242 .index = @enumToInt(Feature.r52),
1243 .name = @tagName(Feature.r52),
12441017 .llvm_name = "r52",
12451018 .description = "Cortex-R52 ARM processors",
1246 .dependencies = featureSet(&[_]Feature{}),
1019 .dependencies = sparseFeatureSet(&[_]Feature{}),
12471020 };
12481021 result[@enumToInt(Feature.r7)] = .{
1249 .index = @enumToInt(Feature.r7),
1250 .name = @tagName(Feature.r7),
12511022 .llvm_name = "r7",
12521023 .description = "Cortex-R7 ARM processors",
1253 .dependencies = featureSet(&[_]Feature{}),
1024 .dependencies = sparseFeatureSet(&[_]Feature{}),
12541025 };
12551026 result[@enumToInt(Feature.ras)] = .{
1256 .index = @enumToInt(Feature.ras),
1257 .name = @tagName(Feature.ras),
12581027 .llvm_name = "ras",
12591028 .description = "Enable Reliability, Availability and Serviceability extensions",
1260 .dependencies = featureSet(&[_]Feature{}),
1029 .dependencies = sparseFeatureSet(&[_]Feature{}),
12611030 };
12621031 result[@enumToInt(Feature.rclass)] = .{
1263 .index = @enumToInt(Feature.rclass),
1264 .name = @tagName(Feature.rclass),
12651032 .llvm_name = "rclass",
12661033 .description = "Is realtime profile ('R' series)",
1267 .dependencies = featureSet(&[_]Feature{}),
1034 .dependencies = sparseFeatureSet(&[_]Feature{}),
12681035 };
12691036 result[@enumToInt(Feature.read_tp_hard)] = .{
1270 .index = @enumToInt(Feature.read_tp_hard),
1271 .name = @tagName(Feature.read_tp_hard),
12721037 .llvm_name = "read-tp-hard",
12731038 .description = "Reading thread pointer from register",
1274 .dependencies = featureSet(&[_]Feature{}),
1039 .dependencies = sparseFeatureSet(&[_]Feature{}),
12751040 };
12761041 result[@enumToInt(Feature.reserve_r9)] = .{
1277 .index = @enumToInt(Feature.reserve_r9),
1278 .name = @tagName(Feature.reserve_r9),
12791042 .llvm_name = "reserve-r9",
12801043 .description = "Reserve R9, making it unavailable as GPR",
1281 .dependencies = featureSet(&[_]Feature{}),
1044 .dependencies = sparseFeatureSet(&[_]Feature{}),
12821045 };
12831046 result[@enumToInt(Feature.ret_addr_stack)] = .{
1284 .index = @enumToInt(Feature.ret_addr_stack),
1285 .name = @tagName(Feature.ret_addr_stack),
12861047 .llvm_name = "ret-addr-stack",
12871048 .description = "Has return address stack",
1288 .dependencies = featureSet(&[_]Feature{}),
1049 .dependencies = sparseFeatureSet(&[_]Feature{}),
12891050 };
12901051 result[@enumToInt(Feature.sb)] = .{
1291 .index = @enumToInt(Feature.sb),
1292 .name = @tagName(Feature.sb),
12931052 .llvm_name = "sb",
12941053 .description = "Enable v8.5a Speculation Barrier",
1295 .dependencies = featureSet(&[_]Feature{}),
1054 .dependencies = sparseFeatureSet(&[_]Feature{}),
12961055 };
12971056 result[@enumToInt(Feature.sha2)] = .{
1298 .index = @enumToInt(Feature.sha2),
1299 .name = @tagName(Feature.sha2),
13001057 .llvm_name = "sha2",
13011058 .description = "Enable SHA1 and SHA256 support",
1302 .dependencies = featureSet(&[_]Feature{
1059 .dependencies = sparseFeatureSet(&[_]Feature{
13031060 .neon,
13041061 }),
13051062 };
13061063 result[@enumToInt(Feature.slow_fp_brcc)] = .{
1307 .index = @enumToInt(Feature.slow_fp_brcc),
1308 .name = @tagName(Feature.slow_fp_brcc),
13091064 .llvm_name = "slow-fp-brcc",
13101065 .description = "FP compare + branch is slow",
1311 .dependencies = featureSet(&[_]Feature{}),
1066 .dependencies = sparseFeatureSet(&[_]Feature{}),
13121067 };
13131068 result[@enumToInt(Feature.slow_load_D_subreg)] = .{
1314 .index = @enumToInt(Feature.slow_load_D_subreg),
1315 .name = @tagName(Feature.slow_load_D_subreg),
13161069 .llvm_name = "slow-load-D-subreg",
13171070 .description = "Loading into D subregs is slow",
1318 .dependencies = featureSet(&[_]Feature{}),
1071 .dependencies = sparseFeatureSet(&[_]Feature{}),
13191072 };
13201073 result[@enumToInt(Feature.slow_odd_reg)] = .{
1321 .index = @enumToInt(Feature.slow_odd_reg),
1322 .name = @tagName(Feature.slow_odd_reg),
13231074 .llvm_name = "slow-odd-reg",
13241075 .description = "VLDM/VSTM starting with an odd register is slow",
1325 .dependencies = featureSet(&[_]Feature{}),
1076 .dependencies = sparseFeatureSet(&[_]Feature{}),
13261077 };
13271078 result[@enumToInt(Feature.slow_vdup32)] = .{
1328 .index = @enumToInt(Feature.slow_vdup32),
1329 .name = @tagName(Feature.slow_vdup32),
13301079 .llvm_name = "slow-vdup32",
13311080 .description = "Has slow VDUP32 - prefer VMOV",
1332 .dependencies = featureSet(&[_]Feature{}),
1081 .dependencies = sparseFeatureSet(&[_]Feature{}),
13331082 };
13341083 result[@enumToInt(Feature.slow_vgetlni32)] = .{
1335 .index = @enumToInt(Feature.slow_vgetlni32),
1336 .name = @tagName(Feature.slow_vgetlni32),
13371084 .llvm_name = "slow-vgetlni32",
13381085 .description = "Has slow VGETLNi32 - prefer VMOV",
1339 .dependencies = featureSet(&[_]Feature{}),
1086 .dependencies = sparseFeatureSet(&[_]Feature{}),
13401087 };
13411088 result[@enumToInt(Feature.slowfpvmlx)] = .{
1342 .index = @enumToInt(Feature.slowfpvmlx),
1343 .name = @tagName(Feature.slowfpvmlx),
13441089 .llvm_name = "slowfpvmlx",
13451090 .description = "Disable VFP / NEON MAC instructions",
1346 .dependencies = featureSet(&[_]Feature{}),
1091 .dependencies = sparseFeatureSet(&[_]Feature{}),
13471092 };
13481093 result[@enumToInt(Feature.soft_float)] = .{
1349 .index = @enumToInt(Feature.soft_float),
1350 .name = @tagName(Feature.soft_float),
13511094 .llvm_name = "soft-float",
13521095 .description = "Use software floating point features.",
1353 .dependencies = featureSet(&[_]Feature{}),
1096 .dependencies = sparseFeatureSet(&[_]Feature{}),
13541097 };
13551098 result[@enumToInt(Feature.splat_vfp_neon)] = .{
1356 .index = @enumToInt(Feature.splat_vfp_neon),
1357 .name = @tagName(Feature.splat_vfp_neon),
13581099 .llvm_name = "splat-vfp-neon",
13591100 .description = "Splat register from VFP to NEON",
1360 .dependencies = featureSet(&[_]Feature{
1101 .dependencies = sparseFeatureSet(&[_]Feature{
13611102 .dont_widen_vmovs,
13621103 }),
13631104 };
13641105 result[@enumToInt(Feature.strict_align)] = .{
1365 .index = @enumToInt(Feature.strict_align),
1366 .name = @tagName(Feature.strict_align),
13671106 .llvm_name = "strict-align",
13681107 .description = "Disallow all unaligned memory access",
1369 .dependencies = featureSet(&[_]Feature{}),
1108 .dependencies = sparseFeatureSet(&[_]Feature{}),
13701109 };
13711110 result[@enumToInt(Feature.swift)] = .{
1372 .index = @enumToInt(Feature.swift),
1373 .name = @tagName(Feature.swift),
13741111 .llvm_name = "swift",
13751112 .description = "Swift ARM processors",
1376 .dependencies = featureSet(&[_]Feature{}),
1113 .dependencies = sparseFeatureSet(&[_]Feature{}),
13771114 };
13781115 result[@enumToInt(Feature.thumb_mode)] = .{
1379 .index = @enumToInt(Feature.thumb_mode),
1380 .name = @tagName(Feature.thumb_mode),
13811116 .llvm_name = "thumb-mode",
13821117 .description = "Thumb mode",
1383 .dependencies = featureSet(&[_]Feature{}),
1118 .dependencies = sparseFeatureSet(&[_]Feature{}),
13841119 };
13851120 result[@enumToInt(Feature.thumb2)] = .{
1386 .index = @enumToInt(Feature.thumb2),
1387 .name = @tagName(Feature.thumb2),
13881121 .llvm_name = "thumb2",
13891122 .description = "Enable Thumb2 instructions",
1390 .dependencies = featureSet(&[_]Feature{}),
1123 .dependencies = sparseFeatureSet(&[_]Feature{}),
13911124 };
13921125 result[@enumToInt(Feature.trustzone)] = .{
1393 .index = @enumToInt(Feature.trustzone),
1394 .name = @tagName(Feature.trustzone),
13951126 .llvm_name = "trustzone",
13961127 .description = "Enable support for TrustZone security extensions",
1397 .dependencies = featureSet(&[_]Feature{}),
1128 .dependencies = sparseFeatureSet(&[_]Feature{}),
13981129 };
13991130 result[@enumToInt(Feature.use_aa)] = .{
1400 .index = @enumToInt(Feature.use_aa),
1401 .name = @tagName(Feature.use_aa),
14021131 .llvm_name = "use-aa",
14031132 .description = "Use alias analysis during codegen",
1404 .dependencies = featureSet(&[_]Feature{}),
1133 .dependencies = sparseFeatureSet(&[_]Feature{}),
14051134 };
14061135 result[@enumToInt(Feature.use_misched)] = .{
1407 .index = @enumToInt(Feature.use_misched),
1408 .name = @tagName(Feature.use_misched),
14091136 .llvm_name = "use-misched",
14101137 .description = "Use the MachineScheduler",
1411 .dependencies = featureSet(&[_]Feature{}),
1138 .dependencies = sparseFeatureSet(&[_]Feature{}),
14121139 };
14131140 result[@enumToInt(Feature.v4t)] = .{
1414 .index = @enumToInt(Feature.v4t),
1415 .name = @tagName(Feature.v4t),
14161141 .llvm_name = "v4t",
14171142 .description = "Support ARM v4T instructions",
1418 .dependencies = featureSet(&[_]Feature{}),
1143 .dependencies = sparseFeatureSet(&[_]Feature{}),
14191144 };
14201145 result[@enumToInt(Feature.v5t)] = .{
1421 .index = @enumToInt(Feature.v5t),
1422 .name = @tagName(Feature.v5t),
14231146 .llvm_name = "v5t",
14241147 .description = "Support ARM v5T instructions",
1425 .dependencies = featureSet(&[_]Feature{
1148 .dependencies = sparseFeatureSet(&[_]Feature{
14261149 .v4t,
14271150 }),
14281151 };
14291152 result[@enumToInt(Feature.v5te)] = .{
1430 .index = @enumToInt(Feature.v5te),
1431 .name = @tagName(Feature.v5te),
14321153 .llvm_name = "v5te",
14331154 .description = "Support ARM v5TE, v5TEj, and v5TExp instructions",
1434 .dependencies = featureSet(&[_]Feature{
1155 .dependencies = sparseFeatureSet(&[_]Feature{
14351156 .v5t,
14361157 }),
14371158 };
14381159 result[@enumToInt(Feature.v6)] = .{
1439 .index = @enumToInt(Feature.v6),
1440 .name = @tagName(Feature.v6),
14411160 .llvm_name = "v6",
14421161 .description = "Support ARM v6 instructions",
1443 .dependencies = featureSet(&[_]Feature{
1162 .dependencies = sparseFeatureSet(&[_]Feature{
14441163 .v5te,
14451164 }),
14461165 };
14471166 result[@enumToInt(Feature.v6k)] = .{
1448 .index = @enumToInt(Feature.v6k),
1449 .name = @tagName(Feature.v6k),
14501167 .llvm_name = "v6k",
14511168 .description = "Support ARM v6k instructions",
1452 .dependencies = featureSet(&[_]Feature{
1169 .dependencies = sparseFeatureSet(&[_]Feature{
14531170 .v6,
14541171 }),
14551172 };
14561173 result[@enumToInt(Feature.v6m)] = .{
1457 .index = @enumToInt(Feature.v6m),
1458 .name = @tagName(Feature.v6m),
14591174 .llvm_name = "v6m",
14601175 .description = "Support ARM v6M instructions",
1461 .dependencies = featureSet(&[_]Feature{
1176 .dependencies = sparseFeatureSet(&[_]Feature{
14621177 .v6,
14631178 }),
14641179 };
14651180 result[@enumToInt(Feature.v6t2)] = .{
1466 .index = @enumToInt(Feature.v6t2),
1467 .name = @tagName(Feature.v6t2),
14681181 .llvm_name = "v6t2",
14691182 .description = "Support ARM v6t2 instructions",
1470 .dependencies = featureSet(&[_]Feature{
1183 .dependencies = sparseFeatureSet(&[_]Feature{
14711184 .thumb2,
14721185 .v6k,
14731186 .v8m,
14741187 }),
14751188 };
14761189 result[@enumToInt(Feature.v7)] = .{
1477 .index = @enumToInt(Feature.v7),
1478 .name = @tagName(Feature.v7),
14791190 .llvm_name = "v7",
14801191 .description = "Support ARM v7 instructions",
1481 .dependencies = featureSet(&[_]Feature{
1192 .dependencies = sparseFeatureSet(&[_]Feature{
14821193 .perfmon,
14831194 .v6t2,
14841195 .v7clrex,
14851196 }),
14861197 };
14871198 result[@enumToInt(Feature.v7clrex)] = .{
1488 .index = @enumToInt(Feature.v7clrex),
1489 .name = @tagName(Feature.v7clrex),
14901199 .llvm_name = "v7clrex",
14911200 .description = "Has v7 clrex instruction",
1492 .dependencies = featureSet(&[_]Feature{}),
1201 .dependencies = sparseFeatureSet(&[_]Feature{}),
14931202 };
14941203 result[@enumToInt(Feature.v8)] = .{
1495 .index = @enumToInt(Feature.v8),
1496 .name = @tagName(Feature.v8),
14971204 .llvm_name = "v8",
14981205 .description = "Support ARM v8 instructions",
1499 .dependencies = featureSet(&[_]Feature{
1206 .dependencies = sparseFeatureSet(&[_]Feature{
15001207 .acquire_release,
15011208 .v7,
15021209 }),
15031210 };
15041211 result[@enumToInt(Feature.v8_1a)] = .{
1505 .index = @enumToInt(Feature.v8_1a),
1506 .name = @tagName(Feature.v8_1a),
15071212 .llvm_name = "v8.1a",
15081213 .description = "Support ARM v8.1a instructions",
1509 .dependencies = featureSet(&[_]Feature{
1214 .dependencies = sparseFeatureSet(&[_]Feature{
15101215 .v8,
15111216 }),
15121217 };
15131218 result[@enumToInt(Feature.v8_1m_main)] = .{
1514 .index = @enumToInt(Feature.v8_1m_main),
1515 .name = @tagName(Feature.v8_1m_main),
15161219 .llvm_name = "v8.1m.main",
15171220 .description = "Support ARM v8-1M Mainline instructions",
1518 .dependencies = featureSet(&[_]Feature{
1221 .dependencies = sparseFeatureSet(&[_]Feature{
15191222 .v8m_main,
15201223 }),
15211224 };
15221225 result[@enumToInt(Feature.v8_2a)] = .{
1523 .index = @enumToInt(Feature.v8_2a),
1524 .name = @tagName(Feature.v8_2a),
15251226 .llvm_name = "v8.2a",
15261227 .description = "Support ARM v8.2a instructions",
1527 .dependencies = featureSet(&[_]Feature{
1228 .dependencies = sparseFeatureSet(&[_]Feature{
15281229 .v8_1a,
15291230 }),
15301231 };
15311232 result[@enumToInt(Feature.v8_3a)] = .{
1532 .index = @enumToInt(Feature.v8_3a),
1533 .name = @tagName(Feature.v8_3a),
15341233 .llvm_name = "v8.3a",
15351234 .description = "Support ARM v8.3a instructions",
1536 .dependencies = featureSet(&[_]Feature{
1235 .dependencies = sparseFeatureSet(&[_]Feature{
15371236 .v8_2a,
15381237 }),
15391238 };
15401239 result[@enumToInt(Feature.v8_4a)] = .{
1541 .index = @enumToInt(Feature.v8_4a),
1542 .name = @tagName(Feature.v8_4a),
15431240 .llvm_name = "v8.4a",
15441241 .description = "Support ARM v8.4a instructions",
1545 .dependencies = featureSet(&[_]Feature{
1242 .dependencies = sparseFeatureSet(&[_]Feature{
15461243 .dotprod,
15471244 .v8_3a,
15481245 }),
15491246 };
15501247 result[@enumToInt(Feature.v8_5a)] = .{
1551 .index = @enumToInt(Feature.v8_5a),
1552 .name = @tagName(Feature.v8_5a),
15531248 .llvm_name = "v8.5a",
15541249 .description = "Support ARM v8.5a instructions",
1555 .dependencies = featureSet(&[_]Feature{
1250 .dependencies = sparseFeatureSet(&[_]Feature{
15561251 .sb,
15571252 .v8_4a,
15581253 }),
15591254 };
15601255 result[@enumToInt(Feature.v8m)] = .{
1561 .index = @enumToInt(Feature.v8m),
1562 .name = @tagName(Feature.v8m),
15631256 .llvm_name = "v8m",
15641257 .description = "Support ARM v8M Baseline instructions",
1565 .dependencies = featureSet(&[_]Feature{
1258 .dependencies = sparseFeatureSet(&[_]Feature{
15661259 .v6m,
15671260 }),
15681261 };
15691262 result[@enumToInt(Feature.v8m_main)] = .{
1570 .index = @enumToInt(Feature.v8m_main),
1571 .name = @tagName(Feature.v8m_main),
15721263 .llvm_name = "v8m.main",
15731264 .description = "Support ARM v8M Mainline instructions",
1574 .dependencies = featureSet(&[_]Feature{
1265 .dependencies = sparseFeatureSet(&[_]Feature{
15751266 .v7,
15761267 }),
15771268 };
15781269 result[@enumToInt(Feature.vfp2)] = .{
1579 .index = @enumToInt(Feature.vfp2),
1580 .name = @tagName(Feature.vfp2),
15811270 .llvm_name = "vfp2",
15821271 .description = "Enable VFP2 instructions",
1583 .dependencies = featureSet(&[_]Feature{
1272 .dependencies = sparseFeatureSet(&[_]Feature{
15841273 .vfp2d16,
15851274 .vfp2sp,
15861275 }),
15871276 };
15881277 result[@enumToInt(Feature.vfp2d16)] = .{
1589 .index = @enumToInt(Feature.vfp2d16),
1590 .name = @tagName(Feature.vfp2d16),
15911278 .llvm_name = "vfp2d16",
15921279 .description = "Enable VFP2 instructions",
1593 .dependencies = featureSet(&[_]Feature{
1280 .dependencies = sparseFeatureSet(&[_]Feature{
15941281 .fp64,
15951282 .vfp2d16sp,
15961283 }),
15971284 };
15981285 result[@enumToInt(Feature.vfp2d16sp)] = .{
1599 .index = @enumToInt(Feature.vfp2d16sp),
1600 .name = @tagName(Feature.vfp2d16sp),
16011286 .llvm_name = "vfp2d16sp",
16021287 .description = "Enable VFP2 instructions with no double precision",
1603 .dependencies = featureSet(&[_]Feature{
1288 .dependencies = sparseFeatureSet(&[_]Feature{
16041289 .fpregs,
16051290 }),
16061291 };
16071292 result[@enumToInt(Feature.vfp2sp)] = .{
1608 .index = @enumToInt(Feature.vfp2sp),
1609 .name = @tagName(Feature.vfp2sp),
16101293 .llvm_name = "vfp2sp",
16111294 .description = "Enable VFP2 instructions with no double precision",
1612 .dependencies = featureSet(&[_]Feature{
1295 .dependencies = sparseFeatureSet(&[_]Feature{
16131296 .vfp2d16sp,
16141297 }),
16151298 };
16161299 result[@enumToInt(Feature.vfp3)] = .{
1617 .index = @enumToInt(Feature.vfp3),
1618 .name = @tagName(Feature.vfp3),
16191300 .llvm_name = "vfp3",
16201301 .description = "Enable VFP3 instructions",
1621 .dependencies = featureSet(&[_]Feature{
1302 .dependencies = sparseFeatureSet(&[_]Feature{
16221303 .vfp3d16,
16231304 .vfp3sp,
16241305 }),
16251306 };
16261307 result[@enumToInt(Feature.vfp3d16)] = .{
1627 .index = @enumToInt(Feature.vfp3d16),
1628 .name = @tagName(Feature.vfp3d16),
16291308 .llvm_name = "vfp3d16",
16301309 .description = "Enable VFP3 instructions with only 16 d-registers",
1631 .dependencies = featureSet(&[_]Feature{
1310 .dependencies = sparseFeatureSet(&[_]Feature{
16321311 .fp64,
16331312 .vfp2,
16341313 .vfp3d16sp,
16351314 }),
16361315 };
16371316 result[@enumToInt(Feature.vfp3d16sp)] = .{
1638 .index = @enumToInt(Feature.vfp3d16sp),
1639 .name = @tagName(Feature.vfp3d16sp),
16401317 .llvm_name = "vfp3d16sp",
16411318 .description = "Enable VFP3 instructions with only 16 d-registers and no double precision",
1642 .dependencies = featureSet(&[_]Feature{
1319 .dependencies = sparseFeatureSet(&[_]Feature{
16431320 .vfp2sp,
16441321 }),
16451322 };
16461323 result[@enumToInt(Feature.vfp3sp)] = .{
1647 .index = @enumToInt(Feature.vfp3sp),
1648 .name = @tagName(Feature.vfp3sp),
16491324 .llvm_name = "vfp3sp",
16501325 .description = "Enable VFP3 instructions with no double precision",
1651 .dependencies = featureSet(&[_]Feature{
1326 .dependencies = sparseFeatureSet(&[_]Feature{
16521327 .d32,
16531328 .vfp3d16sp,
16541329 }),
16551330 };
16561331 result[@enumToInt(Feature.vfp4)] = .{
1657 .index = @enumToInt(Feature.vfp4),
1658 .name = @tagName(Feature.vfp4),
16591332 .llvm_name = "vfp4",
16601333 .description = "Enable VFP4 instructions",
1661 .dependencies = featureSet(&[_]Feature{
1334 .dependencies = sparseFeatureSet(&[_]Feature{
16621335 .fp16,
16631336 .vfp3,
16641337 .vfp4d16,
......@@ -1666,11 +1339,9 @@ pub const all_features = blk: {
16661339 }),
16671340 };
16681341 result[@enumToInt(Feature.vfp4d16)] = .{
1669 .index = @enumToInt(Feature.vfp4d16),
1670 .name = @tagName(Feature.vfp4d16),
16711342 .llvm_name = "vfp4d16",
16721343 .description = "Enable VFP4 instructions with only 16 d-registers",
1673 .dependencies = featureSet(&[_]Feature{
1344 .dependencies = sparseFeatureSet(&[_]Feature{
16741345 .fp16,
16751346 .fp64,
16761347 .vfp3d16,
......@@ -1678,21 +1349,17 @@ pub const all_features = blk: {
16781349 }),
16791350 };
16801351 result[@enumToInt(Feature.vfp4d16sp)] = .{
1681 .index = @enumToInt(Feature.vfp4d16sp),
1682 .name = @tagName(Feature.vfp4d16sp),
16831352 .llvm_name = "vfp4d16sp",
16841353 .description = "Enable VFP4 instructions with only 16 d-registers and no double precision",
1685 .dependencies = featureSet(&[_]Feature{
1354 .dependencies = sparseFeatureSet(&[_]Feature{
16861355 .fp16,
16871356 .vfp3d16sp,
16881357 }),
16891358 };
16901359 result[@enumToInt(Feature.vfp4sp)] = .{
1691 .index = @enumToInt(Feature.vfp4sp),
1692 .name = @tagName(Feature.vfp4sp),
16931360 .llvm_name = "vfp4sp",
16941361 .description = "Enable VFP4 instructions with no double precision",
1695 .dependencies = featureSet(&[_]Feature{
1362 .dependencies = sparseFeatureSet(&[_]Feature{
16961363 .d32,
16971364 .fp16,
16981365 .vfp3sp,
......@@ -1700,59 +1367,51 @@ pub const all_features = blk: {
17001367 }),
17011368 };
17021369 result[@enumToInt(Feature.virtualization)] = .{
1703 .index = @enumToInt(Feature.virtualization),
1704 .name = @tagName(Feature.virtualization),
17051370 .llvm_name = "virtualization",
17061371 .description = "Supports Virtualization extension",
1707 .dependencies = featureSet(&[_]Feature{
1372 .dependencies = sparseFeatureSet(&[_]Feature{
17081373 .hwdiv,
17091374 .hwdiv_arm,
17101375 }),
17111376 };
17121377 result[@enumToInt(Feature.vldn_align)] = .{
1713 .index = @enumToInt(Feature.vldn_align),
1714 .name = @tagName(Feature.vldn_align),
17151378 .llvm_name = "vldn-align",
17161379 .description = "Check for VLDn unaligned access",
1717 .dependencies = featureSet(&[_]Feature{}),
1380 .dependencies = sparseFeatureSet(&[_]Feature{}),
17181381 };
17191382 result[@enumToInt(Feature.vmlx_forwarding)] = .{
1720 .index = @enumToInt(Feature.vmlx_forwarding),
1721 .name = @tagName(Feature.vmlx_forwarding),
17221383 .llvm_name = "vmlx-forwarding",
17231384 .description = "Has multiplier accumulator forwarding",
1724 .dependencies = featureSet(&[_]Feature{}),
1385 .dependencies = sparseFeatureSet(&[_]Feature{}),
17251386 };
17261387 result[@enumToInt(Feature.vmlx_hazards)] = .{
1727 .index = @enumToInt(Feature.vmlx_hazards),
1728 .name = @tagName(Feature.vmlx_hazards),
17291388 .llvm_name = "vmlx-hazards",
17301389 .description = "Has VMLx hazards",
1731 .dependencies = featureSet(&[_]Feature{}),
1390 .dependencies = sparseFeatureSet(&[_]Feature{}),
17321391 };
17331392 result[@enumToInt(Feature.wide_stride_vfp)] = .{
1734 .index = @enumToInt(Feature.wide_stride_vfp),
1735 .name = @tagName(Feature.wide_stride_vfp),
17361393 .llvm_name = "wide-stride-vfp",
17371394 .description = "Use a wide stride when allocating VFP registers",
1738 .dependencies = featureSet(&[_]Feature{}),
1395 .dependencies = sparseFeatureSet(&[_]Feature{}),
17391396 };
17401397 result[@enumToInt(Feature.xscale)] = .{
1741 .index = @enumToInt(Feature.xscale),
1742 .name = @tagName(Feature.xscale),
17431398 .llvm_name = "xscale",
17441399 .description = "ARMv5te architecture",
1745 .dependencies = featureSet(&[_]Feature{
1400 .dependencies = sparseFeatureSet(&[_]Feature{
17461401 .armv5te,
17471402 }),
17481403 };
17491404 result[@enumToInt(Feature.zcz)] = .{
1750 .index = @enumToInt(Feature.zcz),
1751 .name = @tagName(Feature.zcz),
17521405 .llvm_name = "zcz",
17531406 .description = "Has zero-cycle zeroing instructions",
1754 .dependencies = featureSet(&[_]Feature{}),
1755 };
1407 .dependencies = sparseFeatureSet(&[_]Feature{}),
1408 };
1409 const ti = @typeInfo(Feature);
1410 for (result) |*elem, i| {
1411 elem.index = i;
1412 elem.name = ti.Enum.fields[i].name;
1413 elem.dependencies.initAsDependencies(i, &result);
1414 }
17561415 break :blk result;
17571416};
17581417
......@@ -1760,49 +1419,49 @@ pub const cpu = struct {
17601419 pub const arm1020e = Cpu{
17611420 .name = "arm1020e",
17621421 .llvm_name = "arm1020e",
1763 .features = featureSet(&[_]Feature{
1422 .features = featureSet(&all_features, &[_]Feature{
17641423 .armv5te,
17651424 }),
17661425 };
17671426 pub const arm1020t = Cpu{
17681427 .name = "arm1020t",
17691428 .llvm_name = "arm1020t",
1770 .features = featureSet(&[_]Feature{
1429 .features = featureSet(&all_features, &[_]Feature{
17711430 .armv5t,
17721431 }),
17731432 };
17741433 pub const arm1022e = Cpu{
17751434 .name = "arm1022e",
17761435 .llvm_name = "arm1022e",
1777 .features = featureSet(&[_]Feature{
1436 .features = featureSet(&all_features, &[_]Feature{
17781437 .armv5te,
17791438 }),
17801439 };
17811440 pub const arm10e = Cpu{
17821441 .name = "arm10e",
17831442 .llvm_name = "arm10e",
1784 .features = featureSet(&[_]Feature{
1443 .features = featureSet(&all_features, &[_]Feature{
17851444 .armv5te,
17861445 }),
17871446 };
17881447 pub const arm10tdmi = Cpu{
17891448 .name = "arm10tdmi",
17901449 .llvm_name = "arm10tdmi",
1791 .features = featureSet(&[_]Feature{
1450 .features = featureSet(&all_features, &[_]Feature{
17921451 .armv5t,
17931452 }),
17941453 };
17951454 pub const arm1136j_s = Cpu{
17961455 .name = "arm1136j_s",
17971456 .llvm_name = "arm1136j-s",
1798 .features = featureSet(&[_]Feature{
1457 .features = featureSet(&all_features, &[_]Feature{
17991458 .armv6,
18001459 }),
18011460 };
18021461 pub const arm1136jf_s = Cpu{
18031462 .name = "arm1136jf_s",
18041463 .llvm_name = "arm1136jf-s",
1805 .features = featureSet(&[_]Feature{
1464 .features = featureSet(&all_features, &[_]Feature{
18061465 .armv6,
18071466 .slowfpvmlx,
18081467 .vfp2,
......@@ -1811,14 +1470,14 @@ pub const cpu = struct {
18111470 pub const arm1156t2_s = Cpu{
18121471 .name = "arm1156t2_s",
18131472 .llvm_name = "arm1156t2-s",
1814 .features = featureSet(&[_]Feature{
1473 .features = featureSet(&all_features, &[_]Feature{
18151474 .armv6t2,
18161475 }),
18171476 };
18181477 pub const arm1156t2f_s = Cpu{
18191478 .name = "arm1156t2f_s",
18201479 .llvm_name = "arm1156t2f-s",
1821 .features = featureSet(&[_]Feature{
1480 .features = featureSet(&all_features, &[_]Feature{
18221481 .armv6t2,
18231482 .slowfpvmlx,
18241483 .vfp2,
......@@ -1827,21 +1486,21 @@ pub const cpu = struct {
18271486 pub const arm1176j_s = Cpu{
18281487 .name = "arm1176j_s",
18291488 .llvm_name = "arm1176j-s",
1830 .features = featureSet(&[_]Feature{
1489 .features = featureSet(&all_features, &[_]Feature{
18311490 .armv6kz,
18321491 }),
18331492 };
18341493 pub const arm1176jz_s = Cpu{
18351494 .name = "arm1176jz_s",
18361495 .llvm_name = "arm1176jz-s",
1837 .features = featureSet(&[_]Feature{
1496 .features = featureSet(&all_features, &[_]Feature{
18381497 .armv6kz,
18391498 }),
18401499 };
18411500 pub const arm1176jzf_s = Cpu{
18421501 .name = "arm1176jzf_s",
18431502 .llvm_name = "arm1176jzf-s",
1844 .features = featureSet(&[_]Feature{
1503 .features = featureSet(&all_features, &[_]Feature{
18451504 .armv6kz,
18461505 .slowfpvmlx,
18471506 .vfp2,
......@@ -1850,126 +1509,126 @@ pub const cpu = struct {
18501509 pub const arm710t = Cpu{
18511510 .name = "arm710t",
18521511 .llvm_name = "arm710t",
1853 .features = featureSet(&[_]Feature{
1512 .features = featureSet(&all_features, &[_]Feature{
18541513 .armv4t,
18551514 }),
18561515 };
18571516 pub const arm720t = Cpu{
18581517 .name = "arm720t",
18591518 .llvm_name = "arm720t",
1860 .features = featureSet(&[_]Feature{
1519 .features = featureSet(&all_features, &[_]Feature{
18611520 .armv4t,
18621521 }),
18631522 };
18641523 pub const arm7tdmi = Cpu{
18651524 .name = "arm7tdmi",
18661525 .llvm_name = "arm7tdmi",
1867 .features = featureSet(&[_]Feature{
1526 .features = featureSet(&all_features, &[_]Feature{
18681527 .armv4t,
18691528 }),
18701529 };
18711530 pub const arm7tdmi_s = Cpu{
18721531 .name = "arm7tdmi_s",
18731532 .llvm_name = "arm7tdmi-s",
1874 .features = featureSet(&[_]Feature{
1533 .features = featureSet(&all_features, &[_]Feature{
18751534 .armv4t,
18761535 }),
18771536 };
18781537 pub const arm8 = Cpu{
18791538 .name = "arm8",
18801539 .llvm_name = "arm8",
1881 .features = featureSet(&[_]Feature{
1540 .features = featureSet(&all_features, &[_]Feature{
18821541 .armv4,
18831542 }),
18841543 };
18851544 pub const arm810 = Cpu{
18861545 .name = "arm810",
18871546 .llvm_name = "arm810",
1888 .features = featureSet(&[_]Feature{
1547 .features = featureSet(&all_features, &[_]Feature{
18891548 .armv4,
18901549 }),
18911550 };
18921551 pub const arm9 = Cpu{
18931552 .name = "arm9",
18941553 .llvm_name = "arm9",
1895 .features = featureSet(&[_]Feature{
1554 .features = featureSet(&all_features, &[_]Feature{
18961555 .armv4t,
18971556 }),
18981557 };
18991558 pub const arm920 = Cpu{
19001559 .name = "arm920",
19011560 .llvm_name = "arm920",
1902 .features = featureSet(&[_]Feature{
1561 .features = featureSet(&all_features, &[_]Feature{
19031562 .armv4t,
19041563 }),
19051564 };
19061565 pub const arm920t = Cpu{
19071566 .name = "arm920t",
19081567 .llvm_name = "arm920t",
1909 .features = featureSet(&[_]Feature{
1568 .features = featureSet(&all_features, &[_]Feature{
19101569 .armv4t,
19111570 }),
19121571 };
19131572 pub const arm922t = Cpu{
19141573 .name = "arm922t",
19151574 .llvm_name = "arm922t",
1916 .features = featureSet(&[_]Feature{
1575 .features = featureSet(&all_features, &[_]Feature{
19171576 .armv4t,
19181577 }),
19191578 };
19201579 pub const arm926ej_s = Cpu{
19211580 .name = "arm926ej_s",
19221581 .llvm_name = "arm926ej-s",
1923 .features = featureSet(&[_]Feature{
1582 .features = featureSet(&all_features, &[_]Feature{
19241583 .armv5te,
19251584 }),
19261585 };
19271586 pub const arm940t = Cpu{
19281587 .name = "arm940t",
19291588 .llvm_name = "arm940t",
1930 .features = featureSet(&[_]Feature{
1589 .features = featureSet(&all_features, &[_]Feature{
19311590 .armv4t,
19321591 }),
19331592 };
19341593 pub const arm946e_s = Cpu{
19351594 .name = "arm946e_s",
19361595 .llvm_name = "arm946e-s",
1937 .features = featureSet(&[_]Feature{
1596 .features = featureSet(&all_features, &[_]Feature{
19381597 .armv5te,
19391598 }),
19401599 };
19411600 pub const arm966e_s = Cpu{
19421601 .name = "arm966e_s",
19431602 .llvm_name = "arm966e-s",
1944 .features = featureSet(&[_]Feature{
1603 .features = featureSet(&all_features, &[_]Feature{
19451604 .armv5te,
19461605 }),
19471606 };
19481607 pub const arm968e_s = Cpu{
19491608 .name = "arm968e_s",
19501609 .llvm_name = "arm968e-s",
1951 .features = featureSet(&[_]Feature{
1610 .features = featureSet(&all_features, &[_]Feature{
19521611 .armv5te,
19531612 }),
19541613 };
19551614 pub const arm9e = Cpu{
19561615 .name = "arm9e",
19571616 .llvm_name = "arm9e",
1958 .features = featureSet(&[_]Feature{
1617 .features = featureSet(&all_features, &[_]Feature{
19591618 .armv5te,
19601619 }),
19611620 };
19621621 pub const arm9tdmi = Cpu{
19631622 .name = "arm9tdmi",
19641623 .llvm_name = "arm9tdmi",
1965 .features = featureSet(&[_]Feature{
1624 .features = featureSet(&all_features, &[_]Feature{
19661625 .armv4t,
19671626 }),
19681627 };
19691628 pub const cortex_a12 = Cpu{
19701629 .name = "cortex_a12",
19711630 .llvm_name = "cortex-a12",
1972 .features = featureSet(&[_]Feature{
1631 .features = featureSet(&all_features, &[_]Feature{
19731632 .a12,
19741633 .armv7_a,
19751634 .avoid_partial_cpsr,
......@@ -1984,7 +1643,7 @@ pub const cpu = struct {
19841643 pub const cortex_a15 = Cpu{
19851644 .name = "cortex_a15",
19861645 .llvm_name = "cortex-a15",
1987 .features = featureSet(&[_]Feature{
1646 .features = featureSet(&all_features, &[_]Feature{
19881647 .a15,
19891648 .armv7_a,
19901649 .avoid_partial_cpsr,
......@@ -2002,7 +1661,7 @@ pub const cpu = struct {
20021661 pub const cortex_a17 = Cpu{
20031662 .name = "cortex_a17",
20041663 .llvm_name = "cortex-a17",
2005 .features = featureSet(&[_]Feature{
1664 .features = featureSet(&all_features, &[_]Feature{
20061665 .a17,
20071666 .armv7_a,
20081667 .avoid_partial_cpsr,
......@@ -2017,7 +1676,7 @@ pub const cpu = struct {
20171676 pub const cortex_a32 = Cpu{
20181677 .name = "cortex_a32",
20191678 .llvm_name = "cortex-a32",
2020 .features = featureSet(&[_]Feature{
1679 .features = featureSet(&all_features, &[_]Feature{
20211680 .armv8_a,
20221681 .crc,
20231682 .crypto,
......@@ -2028,7 +1687,7 @@ pub const cpu = struct {
20281687 pub const cortex_a35 = Cpu{
20291688 .name = "cortex_a35",
20301689 .llvm_name = "cortex-a35",
2031 .features = featureSet(&[_]Feature{
1690 .features = featureSet(&all_features, &[_]Feature{
20321691 .a35,
20331692 .armv8_a,
20341693 .crc,
......@@ -2040,7 +1699,7 @@ pub const cpu = struct {
20401699 pub const cortex_a5 = Cpu{
20411700 .name = "cortex_a5",
20421701 .llvm_name = "cortex-a5",
2043 .features = featureSet(&[_]Feature{
1702 .features = featureSet(&all_features, &[_]Feature{
20441703 .a5,
20451704 .armv7_a,
20461705 .mp,
......@@ -2055,7 +1714,7 @@ pub const cpu = struct {
20551714 pub const cortex_a53 = Cpu{
20561715 .name = "cortex_a53",
20571716 .llvm_name = "cortex-a53",
2058 .features = featureSet(&[_]Feature{
1717 .features = featureSet(&all_features, &[_]Feature{
20591718 .a53,
20601719 .armv8_a,
20611720 .crc,
......@@ -2068,7 +1727,7 @@ pub const cpu = struct {
20681727 pub const cortex_a55 = Cpu{
20691728 .name = "cortex_a55",
20701729 .llvm_name = "cortex-a55",
2071 .features = featureSet(&[_]Feature{
1730 .features = featureSet(&all_features, &[_]Feature{
20721731 .a55,
20731732 .armv8_2_a,
20741733 .dotprod,
......@@ -2079,7 +1738,7 @@ pub const cpu = struct {
20791738 pub const cortex_a57 = Cpu{
20801739 .name = "cortex_a57",
20811740 .llvm_name = "cortex-a57",
2082 .features = featureSet(&[_]Feature{
1741 .features = featureSet(&all_features, &[_]Feature{
20831742 .a57,
20841743 .armv8_a,
20851744 .avoid_partial_cpsr,
......@@ -2094,7 +1753,7 @@ pub const cpu = struct {
20941753 pub const cortex_a7 = Cpu{
20951754 .name = "cortex_a7",
20961755 .llvm_name = "cortex-a7",
2097 .features = featureSet(&[_]Feature{
1756 .features = featureSet(&all_features, &[_]Feature{
20981757 .a7,
20991758 .armv7_a,
21001759 .mp,
......@@ -2111,7 +1770,7 @@ pub const cpu = struct {
21111770 pub const cortex_a72 = Cpu{
21121771 .name = "cortex_a72",
21131772 .llvm_name = "cortex-a72",
2114 .features = featureSet(&[_]Feature{
1773 .features = featureSet(&all_features, &[_]Feature{
21151774 .a72,
21161775 .armv8_a,
21171776 .crc,
......@@ -2123,7 +1782,7 @@ pub const cpu = struct {
21231782 pub const cortex_a73 = Cpu{
21241783 .name = "cortex_a73",
21251784 .llvm_name = "cortex-a73",
2126 .features = featureSet(&[_]Feature{
1785 .features = featureSet(&all_features, &[_]Feature{
21271786 .a73,
21281787 .armv8_a,
21291788 .crc,
......@@ -2135,7 +1794,7 @@ pub const cpu = struct {
21351794 pub const cortex_a75 = Cpu{
21361795 .name = "cortex_a75",
21371796 .llvm_name = "cortex-a75",
2138 .features = featureSet(&[_]Feature{
1797 .features = featureSet(&all_features, &[_]Feature{
21391798 .a75,
21401799 .armv8_2_a,
21411800 .dotprod,
......@@ -2146,7 +1805,7 @@ pub const cpu = struct {
21461805 pub const cortex_a76 = Cpu{
21471806 .name = "cortex_a76",
21481807 .llvm_name = "cortex-a76",
2149 .features = featureSet(&[_]Feature{
1808 .features = featureSet(&all_features, &[_]Feature{
21501809 .a76,
21511810 .armv8_2_a,
21521811 .crc,
......@@ -2160,7 +1819,7 @@ pub const cpu = struct {
21601819 pub const cortex_a76ae = Cpu{
21611820 .name = "cortex_a76ae",
21621821 .llvm_name = "cortex-a76ae",
2163 .features = featureSet(&[_]Feature{
1822 .features = featureSet(&all_features, &[_]Feature{
21641823 .a76,
21651824 .armv8_2_a,
21661825 .crc,
......@@ -2174,7 +1833,7 @@ pub const cpu = struct {
21741833 pub const cortex_a8 = Cpu{
21751834 .name = "cortex_a8",
21761835 .llvm_name = "cortex-a8",
2177 .features = featureSet(&[_]Feature{
1836 .features = featureSet(&all_features, &[_]Feature{
21781837 .a8,
21791838 .armv7_a,
21801839 .nonpipelined_vfp,
......@@ -2189,7 +1848,7 @@ pub const cpu = struct {
21891848 pub const cortex_a9 = Cpu{
21901849 .name = "cortex_a9",
21911850 .llvm_name = "cortex-a9",
2192 .features = featureSet(&[_]Feature{
1851 .features = featureSet(&all_features, &[_]Feature{
21931852 .a9,
21941853 .armv7_a,
21951854 .avoid_partial_cpsr,
......@@ -2209,28 +1868,28 @@ pub const cpu = struct {
22091868 pub const cortex_m0 = Cpu{
22101869 .name = "cortex_m0",
22111870 .llvm_name = "cortex-m0",
2212 .features = featureSet(&[_]Feature{
1871 .features = featureSet(&all_features, &[_]Feature{
22131872 .armv6_m,
22141873 }),
22151874 };
22161875 pub const cortex_m0plus = Cpu{
22171876 .name = "cortex_m0plus",
22181877 .llvm_name = "cortex-m0plus",
2219 .features = featureSet(&[_]Feature{
1878 .features = featureSet(&all_features, &[_]Feature{
22201879 .armv6_m,
22211880 }),
22221881 };
22231882 pub const cortex_m1 = Cpu{
22241883 .name = "cortex_m1",
22251884 .llvm_name = "cortex-m1",
2226 .features = featureSet(&[_]Feature{
1885 .features = featureSet(&all_features, &[_]Feature{
22271886 .armv6_m,
22281887 }),
22291888 };
22301889 pub const cortex_m23 = Cpu{
22311890 .name = "cortex_m23",
22321891 .llvm_name = "cortex-m23",
2233 .features = featureSet(&[_]Feature{
1892 .features = featureSet(&all_features, &[_]Feature{
22341893 .armv8_m_base,
22351894 .no_movt,
22361895 }),
......@@ -2238,7 +1897,7 @@ pub const cpu = struct {
22381897 pub const cortex_m3 = Cpu{
22391898 .name = "cortex_m3",
22401899 .llvm_name = "cortex-m3",
2241 .features = featureSet(&[_]Feature{
1900 .features = featureSet(&all_features, &[_]Feature{
22421901 .armv7_m,
22431902 .loop_align,
22441903 .m3,
......@@ -2250,7 +1909,7 @@ pub const cpu = struct {
22501909 pub const cortex_m33 = Cpu{
22511910 .name = "cortex_m33",
22521911 .llvm_name = "cortex-m33",
2253 .features = featureSet(&[_]Feature{
1912 .features = featureSet(&all_features, &[_]Feature{
22541913 .armv8_m_main,
22551914 .dsp,
22561915 .fp_armv8d16sp,
......@@ -2264,7 +1923,7 @@ pub const cpu = struct {
22641923 pub const cortex_m35p = Cpu{
22651924 .name = "cortex_m35p",
22661925 .llvm_name = "cortex-m35p",
2267 .features = featureSet(&[_]Feature{
1926 .features = featureSet(&all_features, &[_]Feature{
22681927 .armv8_m_main,
22691928 .dsp,
22701929 .fp_armv8d16sp,
......@@ -2278,7 +1937,7 @@ pub const cpu = struct {
22781937 pub const cortex_m4 = Cpu{
22791938 .name = "cortex_m4",
22801939 .llvm_name = "cortex-m4",
2281 .features = featureSet(&[_]Feature{
1940 .features = featureSet(&all_features, &[_]Feature{
22821941 .armv7e_m,
22831942 .loop_align,
22841943 .no_branch_predictor,
......@@ -2291,7 +1950,7 @@ pub const cpu = struct {
22911950 pub const cortex_m7 = Cpu{
22921951 .name = "cortex_m7",
22931952 .llvm_name = "cortex-m7",
2294 .features = featureSet(&[_]Feature{
1953 .features = featureSet(&all_features, &[_]Feature{
22951954 .armv7e_m,
22961955 .fp_armv8d16,
22971956 }),
......@@ -2299,7 +1958,7 @@ pub const cpu = struct {
22991958 pub const cortex_r4 = Cpu{
23001959 .name = "cortex_r4",
23011960 .llvm_name = "cortex-r4",
2302 .features = featureSet(&[_]Feature{
1961 .features = featureSet(&all_features, &[_]Feature{
23031962 .armv7_r,
23041963 .avoid_partial_cpsr,
23051964 .r4,
......@@ -2309,7 +1968,7 @@ pub const cpu = struct {
23091968 pub const cortex_r4f = Cpu{
23101969 .name = "cortex_r4f",
23111970 .llvm_name = "cortex-r4f",
2312 .features = featureSet(&[_]Feature{
1971 .features = featureSet(&all_features, &[_]Feature{
23131972 .armv7_r,
23141973 .avoid_partial_cpsr,
23151974 .r4,
......@@ -2322,7 +1981,7 @@ pub const cpu = struct {
23221981 pub const cortex_r5 = Cpu{
23231982 .name = "cortex_r5",
23241983 .llvm_name = "cortex-r5",
2325 .features = featureSet(&[_]Feature{
1984 .features = featureSet(&all_features, &[_]Feature{
23261985 .armv7_r,
23271986 .avoid_partial_cpsr,
23281987 .hwdiv_arm,
......@@ -2336,7 +1995,7 @@ pub const cpu = struct {
23361995 pub const cortex_r52 = Cpu{
23371996 .name = "cortex_r52",
23381997 .llvm_name = "cortex-r52",
2339 .features = featureSet(&[_]Feature{
1998 .features = featureSet(&all_features, &[_]Feature{
23401999 .armv8_r,
23412000 .fpao,
23422001 .r52,
......@@ -2347,7 +2006,7 @@ pub const cpu = struct {
23472006 pub const cortex_r7 = Cpu{
23482007 .name = "cortex_r7",
23492008 .llvm_name = "cortex-r7",
2350 .features = featureSet(&[_]Feature{
2009 .features = featureSet(&all_features, &[_]Feature{
23512010 .armv7_r,
23522011 .avoid_partial_cpsr,
23532012 .fp16,
......@@ -2363,7 +2022,7 @@ pub const cpu = struct {
23632022 pub const cortex_r8 = Cpu{
23642023 .name = "cortex_r8",
23652024 .llvm_name = "cortex-r8",
2366 .features = featureSet(&[_]Feature{
2025 .features = featureSet(&all_features, &[_]Feature{
23672026 .armv7_r,
23682027 .avoid_partial_cpsr,
23692028 .fp16,
......@@ -2378,7 +2037,7 @@ pub const cpu = struct {
23782037 pub const cyclone = Cpu{
23792038 .name = "cyclone",
23802039 .llvm_name = "cyclone",
2381 .features = featureSet(&[_]Feature{
2040 .features = featureSet(&all_features, &[_]Feature{
23822041 .armv8_a,
23832042 .avoid_movs_shop,
23842043 .avoid_partial_cpsr,
......@@ -2399,14 +2058,14 @@ pub const cpu = struct {
23992058 pub const ep9312 = Cpu{
24002059 .name = "ep9312",
24012060 .llvm_name = "ep9312",
2402 .features = featureSet(&[_]Feature{
2061 .features = featureSet(&all_features, &[_]Feature{
24032062 .armv4t,
24042063 }),
24052064 };
24062065 pub const exynos_m1 = Cpu{
24072066 .name = "exynos_m1",
24082067 .llvm_name = "exynos-m1",
2409 .features = featureSet(&[_]Feature{
2068 .features = featureSet(&all_features, &[_]Feature{
24102069 .armv8_a,
24112070 .exynos,
24122071 }),
......@@ -2414,7 +2073,7 @@ pub const cpu = struct {
24142073 pub const exynos_m2 = Cpu{
24152074 .name = "exynos_m2",
24162075 .llvm_name = "exynos-m2",
2417 .features = featureSet(&[_]Feature{
2076 .features = featureSet(&all_features, &[_]Feature{
24182077 .armv8_a,
24192078 .exynos,
24202079 }),
......@@ -2422,7 +2081,7 @@ pub const cpu = struct {
24222081 pub const exynos_m3 = Cpu{
24232082 .name = "exynos_m3",
24242083 .llvm_name = "exynos-m3",
2425 .features = featureSet(&[_]Feature{
2084 .features = featureSet(&all_features, &[_]Feature{
24262085 .armv8_a,
24272086 .exynos,
24282087 }),
......@@ -2430,7 +2089,7 @@ pub const cpu = struct {
24302089 pub const exynos_m4 = Cpu{
24312090 .name = "exynos_m4",
24322091 .llvm_name = "exynos-m4",
2433 .features = featureSet(&[_]Feature{
2092 .features = featureSet(&all_features, &[_]Feature{
24342093 .armv8_2_a,
24352094 .dotprod,
24362095 .exynos,
......@@ -2440,7 +2099,7 @@ pub const cpu = struct {
24402099 pub const exynos_m5 = Cpu{
24412100 .name = "exynos_m5",
24422101 .llvm_name = "exynos-m5",
2443 .features = featureSet(&[_]Feature{
2102 .features = featureSet(&all_features, &[_]Feature{
24442103 .armv8_2_a,
24452104 .dotprod,
24462105 .exynos,
......@@ -2450,19 +2109,19 @@ pub const cpu = struct {
24502109 pub const generic = Cpu{
24512110 .name = "generic",
24522111 .llvm_name = "generic",
2453 .features = featureSet(&[_]Feature{}),
2112 .features = featureSet(&all_features, &[_]Feature{}),
24542113 };
24552114 pub const iwmmxt = Cpu{
24562115 .name = "iwmmxt",
24572116 .llvm_name = "iwmmxt",
2458 .features = featureSet(&[_]Feature{
2117 .features = featureSet(&all_features, &[_]Feature{
24592118 .armv5te,
24602119 }),
24612120 };
24622121 pub const krait = Cpu{
24632122 .name = "krait",
24642123 .llvm_name = "krait",
2465 .features = featureSet(&[_]Feature{
2124 .features = featureSet(&all_features, &[_]Feature{
24662125 .armv7_a,
24672126 .avoid_partial_cpsr,
24682127 .fp16,
......@@ -2479,7 +2138,7 @@ pub const cpu = struct {
24792138 pub const kryo = Cpu{
24802139 .name = "kryo",
24812140 .llvm_name = "kryo",
2482 .features = featureSet(&[_]Feature{
2141 .features = featureSet(&all_features, &[_]Feature{
24832142 .armv8_a,
24842143 .crc,
24852144 .crypto,
......@@ -2491,7 +2150,7 @@ pub const cpu = struct {
24912150 pub const mpcore = Cpu{
24922151 .name = "mpcore",
24932152 .llvm_name = "mpcore",
2494 .features = featureSet(&[_]Feature{
2153 .features = featureSet(&all_features, &[_]Feature{
24952154 .armv6k,
24962155 .slowfpvmlx,
24972156 .vfp2,
......@@ -2500,21 +2159,21 @@ pub const cpu = struct {
25002159 pub const mpcorenovfp = Cpu{
25012160 .name = "mpcorenovfp",
25022161 .llvm_name = "mpcorenovfp",
2503 .features = featureSet(&[_]Feature{
2162 .features = featureSet(&all_features, &[_]Feature{
25042163 .armv6k,
25052164 }),
25062165 };
25072166 pub const sc000 = Cpu{
25082167 .name = "sc000",
25092168 .llvm_name = "sc000",
2510 .features = featureSet(&[_]Feature{
2169 .features = featureSet(&all_features, &[_]Feature{
25112170 .armv6_m,
25122171 }),
25132172 };
25142173 pub const sc300 = Cpu{
25152174 .name = "sc300",
25162175 .llvm_name = "sc300",
2517 .features = featureSet(&[_]Feature{
2176 .features = featureSet(&all_features, &[_]Feature{
25182177 .armv7_m,
25192178 .m3,
25202179 .no_branch_predictor,
......@@ -2525,35 +2184,35 @@ pub const cpu = struct {
25252184 pub const strongarm = Cpu{
25262185 .name = "strongarm",
25272186 .llvm_name = "strongarm",
2528 .features = featureSet(&[_]Feature{
2187 .features = featureSet(&all_features, &[_]Feature{
25292188 .armv4,
25302189 }),
25312190 };
25322191 pub const strongarm110 = Cpu{
25332192 .name = "strongarm110",
25342193 .llvm_name = "strongarm110",
2535 .features = featureSet(&[_]Feature{
2194 .features = featureSet(&all_features, &[_]Feature{
25362195 .armv4,
25372196 }),
25382197 };
25392198 pub const strongarm1100 = Cpu{
25402199 .name = "strongarm1100",
25412200 .llvm_name = "strongarm1100",
2542 .features = featureSet(&[_]Feature{
2201 .features = featureSet(&all_features, &[_]Feature{
25432202 .armv4,
25442203 }),
25452204 };
25462205 pub const strongarm1110 = Cpu{
25472206 .name = "strongarm1110",
25482207 .llvm_name = "strongarm1110",
2549 .features = featureSet(&[_]Feature{
2208 .features = featureSet(&all_features, &[_]Feature{
25502209 .armv4,
25512210 }),
25522211 };
25532212 pub const swift = Cpu{
25542213 .name = "swift",
25552214 .llvm_name = "swift",
2556 .features = featureSet(&[_]Feature{
2215 .features = featureSet(&all_features, &[_]Feature{
25572216 .armv7_a,
25582217 .avoid_movs_shop,
25592218 .avoid_partial_cpsr,
......@@ -2580,7 +2239,7 @@ pub const cpu = struct {
25802239 pub const xscale = Cpu{
25812240 .name = "xscale",
25822241 .llvm_name = "xscale",
2583 .features = featureSet(&[_]Feature{
2242 .features = featureSet(&all_features, &[_]Feature{
25842243 .armv5te,
25852244 }),
25862245 };
lib/std/target/avr.zig+298-358
......@@ -41,38 +41,30 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
4141
4242pub const all_features = blk: {
4343 const len = @typeInfo(Feature).Enum.fields.len;
44 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
44 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
4545 var result: [len]Cpu.Feature = undefined;
4646 result[@enumToInt(Feature.addsubiw)] = .{
47 .index = @enumToInt(Feature.addsubiw),
48 .name = @tagName(Feature.addsubiw),
4947 .llvm_name = "addsubiw",
5048 .description = "Enable 16-bit register-immediate addition and subtraction instructions",
51 .dependencies = featureSet(&[_]Feature{}),
49 .dependencies = sparseFeatureSet(&[_]Feature{}),
5250 };
5351 result[@enumToInt(Feature.avr0)] = .{
54 .index = @enumToInt(Feature.avr0),
55 .name = @tagName(Feature.avr0),
5652 .llvm_name = "avr0",
5753 .description = "The device is a part of the avr0 family",
58 .dependencies = featureSet(&[_]Feature{}),
54 .dependencies = sparseFeatureSet(&[_]Feature{}),
5955 };
6056 result[@enumToInt(Feature.avr1)] = .{
61 .index = @enumToInt(Feature.avr1),
62 .name = @tagName(Feature.avr1),
6357 .llvm_name = "avr1",
6458 .description = "The device is a part of the avr1 family",
65 .dependencies = featureSet(&[_]Feature{
59 .dependencies = sparseFeatureSet(&[_]Feature{
6660 .avr0,
6761 .lpm,
6862 }),
6963 };
7064 result[@enumToInt(Feature.avr2)] = .{
71 .index = @enumToInt(Feature.avr2),
72 .name = @tagName(Feature.avr2),
7365 .llvm_name = "avr2",
7466 .description = "The device is a part of the avr2 family",
75 .dependencies = featureSet(&[_]Feature{
67 .dependencies = sparseFeatureSet(&[_]Feature{
7668 .addsubiw,
7769 .avr1,
7870 .ijmpcall,
......@@ -80,11 +72,9 @@ pub const all_features = blk: {
8072 }),
8173 };
8274 result[@enumToInt(Feature.avr25)] = .{
83 .index = @enumToInt(Feature.avr25),
84 .name = @tagName(Feature.avr25),
8575 .llvm_name = "avr25",
8676 .description = "The device is a part of the avr25 family",
87 .dependencies = featureSet(&[_]Feature{
77 .dependencies = sparseFeatureSet(&[_]Feature{
8878 .avr2,
8979 .@"break",
9080 .lpmx,
......@@ -93,31 +83,25 @@ pub const all_features = blk: {
9383 }),
9484 };
9585 result[@enumToInt(Feature.avr3)] = .{
96 .index = @enumToInt(Feature.avr3),
97 .name = @tagName(Feature.avr3),
9886 .llvm_name = "avr3",
9987 .description = "The device is a part of the avr3 family",
100 .dependencies = featureSet(&[_]Feature{
88 .dependencies = sparseFeatureSet(&[_]Feature{
10189 .avr2,
10290 .jmpcall,
10391 }),
10492 };
10593 result[@enumToInt(Feature.avr31)] = .{
106 .index = @enumToInt(Feature.avr31),
107 .name = @tagName(Feature.avr31),
10894 .llvm_name = "avr31",
10995 .description = "The device is a part of the avr31 family",
110 .dependencies = featureSet(&[_]Feature{
96 .dependencies = sparseFeatureSet(&[_]Feature{
11197 .avr3,
11298 .elpm,
11399 }),
114100 };
115101 result[@enumToInt(Feature.avr35)] = .{
116 .index = @enumToInt(Feature.avr35),
117 .name = @tagName(Feature.avr35),
118102 .llvm_name = "avr35",
119103 .description = "The device is a part of the avr35 family",
120 .dependencies = featureSet(&[_]Feature{
104 .dependencies = sparseFeatureSet(&[_]Feature{
121105 .avr3,
122106 .@"break",
123107 .lpmx,
......@@ -126,11 +110,9 @@ pub const all_features = blk: {
126110 }),
127111 };
128112 result[@enumToInt(Feature.avr4)] = .{
129 .index = @enumToInt(Feature.avr4),
130 .name = @tagName(Feature.avr4),
131113 .llvm_name = "avr4",
132114 .description = "The device is a part of the avr4 family",
133 .dependencies = featureSet(&[_]Feature{
115 .dependencies = sparseFeatureSet(&[_]Feature{
134116 .avr2,
135117 .@"break",
136118 .lpmx,
......@@ -140,11 +122,9 @@ pub const all_features = blk: {
140122 }),
141123 };
142124 result[@enumToInt(Feature.avr5)] = .{
143 .index = @enumToInt(Feature.avr5),
144 .name = @tagName(Feature.avr5),
145125 .llvm_name = "avr5",
146126 .description = "The device is a part of the avr5 family",
147 .dependencies = featureSet(&[_]Feature{
127 .dependencies = sparseFeatureSet(&[_]Feature{
148128 .avr3,
149129 .@"break",
150130 .lpmx,
......@@ -154,31 +134,25 @@ pub const all_features = blk: {
154134 }),
155135 };
156136 result[@enumToInt(Feature.avr51)] = .{
157 .index = @enumToInt(Feature.avr51),
158 .name = @tagName(Feature.avr51),
159137 .llvm_name = "avr51",
160138 .description = "The device is a part of the avr51 family",
161 .dependencies = featureSet(&[_]Feature{
139 .dependencies = sparseFeatureSet(&[_]Feature{
162140 .avr5,
163141 .elpm,
164142 .elpmx,
165143 }),
166144 };
167145 result[@enumToInt(Feature.avr6)] = .{
168 .index = @enumToInt(Feature.avr6),
169 .name = @tagName(Feature.avr6),
170146 .llvm_name = "avr6",
171147 .description = "The device is a part of the avr6 family",
172 .dependencies = featureSet(&[_]Feature{
148 .dependencies = sparseFeatureSet(&[_]Feature{
173149 .avr51,
174150 }),
175151 };
176152 result[@enumToInt(Feature.avrtiny)] = .{
177 .index = @enumToInt(Feature.avrtiny),
178 .name = @tagName(Feature.avrtiny),
179153 .llvm_name = "avrtiny",
180154 .description = "The device is a part of the avrtiny family",
181 .dependencies = featureSet(&[_]Feature{
155 .dependencies = sparseFeatureSet(&[_]Feature{
182156 .avr0,
183157 .@"break",
184158 .sram,
......@@ -186,102 +160,74 @@ pub const all_features = blk: {
186160 }),
187161 };
188162 result[@enumToInt(Feature.@"break")] = .{
189 .index = @enumToInt(Feature.@"break"),
190 .name = @tagName(Feature.@"break"),
191163 .llvm_name = "break",
192164 .description = "The device supports the `BREAK` debugging instruction",
193 .dependencies = featureSet(&[_]Feature{}),
165 .dependencies = sparseFeatureSet(&[_]Feature{}),
194166 };
195167 result[@enumToInt(Feature.des)] = .{
196 .index = @enumToInt(Feature.des),
197 .name = @tagName(Feature.des),
198168 .llvm_name = "des",
199169 .description = "The device supports the `DES k` encryption instruction",
200 .dependencies = featureSet(&[_]Feature{}),
170 .dependencies = sparseFeatureSet(&[_]Feature{}),
201171 };
202172 result[@enumToInt(Feature.eijmpcall)] = .{
203 .index = @enumToInt(Feature.eijmpcall),
204 .name = @tagName(Feature.eijmpcall),
205173 .llvm_name = "eijmpcall",
206174 .description = "The device supports the `EIJMP`/`EICALL` instructions",
207 .dependencies = featureSet(&[_]Feature{}),
175 .dependencies = sparseFeatureSet(&[_]Feature{}),
208176 };
209177 result[@enumToInt(Feature.elpm)] = .{
210 .index = @enumToInt(Feature.elpm),
211 .name = @tagName(Feature.elpm),
212178 .llvm_name = "elpm",
213179 .description = "The device supports the ELPM instruction",
214 .dependencies = featureSet(&[_]Feature{}),
180 .dependencies = sparseFeatureSet(&[_]Feature{}),
215181 };
216182 result[@enumToInt(Feature.elpmx)] = .{
217 .index = @enumToInt(Feature.elpmx),
218 .name = @tagName(Feature.elpmx),
219183 .llvm_name = "elpmx",
220184 .description = "The device supports the `ELPM Rd, Z[+]` instructions",
221 .dependencies = featureSet(&[_]Feature{}),
185 .dependencies = sparseFeatureSet(&[_]Feature{}),
222186 };
223187 result[@enumToInt(Feature.ijmpcall)] = .{
224 .index = @enumToInt(Feature.ijmpcall),
225 .name = @tagName(Feature.ijmpcall),
226188 .llvm_name = "ijmpcall",
227189 .description = "The device supports `IJMP`/`ICALL`instructions",
228 .dependencies = featureSet(&[_]Feature{}),
190 .dependencies = sparseFeatureSet(&[_]Feature{}),
229191 };
230192 result[@enumToInt(Feature.jmpcall)] = .{
231 .index = @enumToInt(Feature.jmpcall),
232 .name = @tagName(Feature.jmpcall),
233193 .llvm_name = "jmpcall",
234194 .description = "The device supports the `JMP` and `CALL` instructions",
235 .dependencies = featureSet(&[_]Feature{}),
195 .dependencies = sparseFeatureSet(&[_]Feature{}),
236196 };
237197 result[@enumToInt(Feature.lpm)] = .{
238 .index = @enumToInt(Feature.lpm),
239 .name = @tagName(Feature.lpm),
240198 .llvm_name = "lpm",
241199 .description = "The device supports the `LPM` instruction",
242 .dependencies = featureSet(&[_]Feature{}),
200 .dependencies = sparseFeatureSet(&[_]Feature{}),
243201 };
244202 result[@enumToInt(Feature.lpmx)] = .{
245 .index = @enumToInt(Feature.lpmx),
246 .name = @tagName(Feature.lpmx),
247203 .llvm_name = "lpmx",
248204 .description = "The device supports the `LPM Rd, Z[+]` instruction",
249 .dependencies = featureSet(&[_]Feature{}),
205 .dependencies = sparseFeatureSet(&[_]Feature{}),
250206 };
251207 result[@enumToInt(Feature.movw)] = .{
252 .index = @enumToInt(Feature.movw),
253 .name = @tagName(Feature.movw),
254208 .llvm_name = "movw",
255209 .description = "The device supports the 16-bit MOVW instruction",
256 .dependencies = featureSet(&[_]Feature{}),
210 .dependencies = sparseFeatureSet(&[_]Feature{}),
257211 };
258212 result[@enumToInt(Feature.mul)] = .{
259 .index = @enumToInt(Feature.mul),
260 .name = @tagName(Feature.mul),
261213 .llvm_name = "mul",
262214 .description = "The device supports the multiplication instructions",
263 .dependencies = featureSet(&[_]Feature{}),
215 .dependencies = sparseFeatureSet(&[_]Feature{}),
264216 };
265217 result[@enumToInt(Feature.rmw)] = .{
266 .index = @enumToInt(Feature.rmw),
267 .name = @tagName(Feature.rmw),
268218 .llvm_name = "rmw",
269219 .description = "The device supports the read-write-modify instructions: XCH, LAS, LAC, LAT",
270 .dependencies = featureSet(&[_]Feature{}),
220 .dependencies = sparseFeatureSet(&[_]Feature{}),
271221 };
272222 result[@enumToInt(Feature.smallstack)] = .{
273 .index = @enumToInt(Feature.smallstack),
274 .name = @tagName(Feature.smallstack),
275223 .llvm_name = "smallstack",
276224 .description = "The device has an 8-bit stack pointer",
277 .dependencies = featureSet(&[_]Feature{}),
225 .dependencies = sparseFeatureSet(&[_]Feature{}),
278226 };
279227 result[@enumToInt(Feature.special)] = .{
280 .index = @enumToInt(Feature.special),
281 .name = @tagName(Feature.special),
282228 .llvm_name = "special",
283229 .description = "Enable use of the entire instruction set - used for debugging",
284 .dependencies = featureSet(&[_]Feature{
230 .dependencies = sparseFeatureSet(&[_]Feature{
285231 .addsubiw,
286232 .@"break",
287233 .des,
......@@ -301,39 +247,29 @@ pub const all_features = blk: {
301247 }),
302248 };
303249 result[@enumToInt(Feature.spm)] = .{
304 .index = @enumToInt(Feature.spm),
305 .name = @tagName(Feature.spm),
306250 .llvm_name = "spm",
307251 .description = "The device supports the `SPM` instruction",
308 .dependencies = featureSet(&[_]Feature{}),
252 .dependencies = sparseFeatureSet(&[_]Feature{}),
309253 };
310254 result[@enumToInt(Feature.spmx)] = .{
311 .index = @enumToInt(Feature.spmx),
312 .name = @tagName(Feature.spmx),
313255 .llvm_name = "spmx",
314256 .description = "The device supports the `SPM Z+` instruction",
315 .dependencies = featureSet(&[_]Feature{}),
257 .dependencies = sparseFeatureSet(&[_]Feature{}),
316258 };
317259 result[@enumToInt(Feature.sram)] = .{
318 .index = @enumToInt(Feature.sram),
319 .name = @tagName(Feature.sram),
320260 .llvm_name = "sram",
321261 .description = "The device has random access memory",
322 .dependencies = featureSet(&[_]Feature{}),
262 .dependencies = sparseFeatureSet(&[_]Feature{}),
323263 };
324264 result[@enumToInt(Feature.tinyencoding)] = .{
325 .index = @enumToInt(Feature.tinyencoding),
326 .name = @tagName(Feature.tinyencoding),
327265 .llvm_name = "tinyencoding",
328266 .description = "The device has Tiny core specific instruction encodings",
329 .dependencies = featureSet(&[_]Feature{}),
267 .dependencies = sparseFeatureSet(&[_]Feature{}),
330268 };
331269 result[@enumToInt(Feature.xmega)] = .{
332 .index = @enumToInt(Feature.xmega),
333 .name = @tagName(Feature.xmega),
334270 .llvm_name = "xmega",
335271 .description = "The device is a part of the xmega family",
336 .dependencies = featureSet(&[_]Feature{
272 .dependencies = sparseFeatureSet(&[_]Feature{
337273 .avr51,
338274 .des,
339275 .eijmpcall,
......@@ -341,15 +277,19 @@ pub const all_features = blk: {
341277 }),
342278 };
343279 result[@enumToInt(Feature.xmegau)] = .{
344 .index = @enumToInt(Feature.xmegau),
345 .name = @tagName(Feature.xmegau),
346280 .llvm_name = "xmegau",
347281 .description = "The device is a part of the xmegau family",
348 .dependencies = featureSet(&[_]Feature{
282 .dependencies = sparseFeatureSet(&[_]Feature{
349283 .rmw,
350284 .xmega,
351285 }),
352286 };
287 const ti = @typeInfo(Feature);
288 for (result) |*elem, i| {
289 elem.index = i;
290 elem.name = ti.Enum.fields[i].name;
291 elem.dependencies.initAsDependencies(i, &result);
292 }
353293 break :blk result;
354294};
355295
......@@ -357,28 +297,28 @@ pub const cpu = struct {
357297 pub const at43usb320 = Cpu{
358298 .name = "at43usb320",
359299 .llvm_name = "at43usb320",
360 .features = featureSet(&[_]Feature{
300 .features = featureSet(&all_features, &[_]Feature{
361301 .avr31,
362302 }),
363303 };
364304 pub const at43usb355 = Cpu{
365305 .name = "at43usb355",
366306 .llvm_name = "at43usb355",
367 .features = featureSet(&[_]Feature{
307 .features = featureSet(&all_features, &[_]Feature{
368308 .avr3,
369309 }),
370310 };
371311 pub const at76c711 = Cpu{
372312 .name = "at76c711",
373313 .llvm_name = "at76c711",
374 .features = featureSet(&[_]Feature{
314 .features = featureSet(&all_features, &[_]Feature{
375315 .avr3,
376316 }),
377317 };
378318 pub const at86rf401 = Cpu{
379319 .name = "at86rf401",
380320 .llvm_name = "at86rf401",
381 .features = featureSet(&[_]Feature{
321 .features = featureSet(&all_features, &[_]Feature{
382322 .avr2,
383323 .lpmx,
384324 .movw,
......@@ -387,217 +327,217 @@ pub const cpu = struct {
387327 pub const at90c8534 = Cpu{
388328 .name = "at90c8534",
389329 .llvm_name = "at90c8534",
390 .features = featureSet(&[_]Feature{
330 .features = featureSet(&all_features, &[_]Feature{
391331 .avr2,
392332 }),
393333 };
394334 pub const at90can128 = Cpu{
395335 .name = "at90can128",
396336 .llvm_name = "at90can128",
397 .features = featureSet(&[_]Feature{
337 .features = featureSet(&all_features, &[_]Feature{
398338 .avr51,
399339 }),
400340 };
401341 pub const at90can32 = Cpu{
402342 .name = "at90can32",
403343 .llvm_name = "at90can32",
404 .features = featureSet(&[_]Feature{
344 .features = featureSet(&all_features, &[_]Feature{
405345 .avr5,
406346 }),
407347 };
408348 pub const at90can64 = Cpu{
409349 .name = "at90can64",
410350 .llvm_name = "at90can64",
411 .features = featureSet(&[_]Feature{
351 .features = featureSet(&all_features, &[_]Feature{
412352 .avr5,
413353 }),
414354 };
415355 pub const at90pwm1 = Cpu{
416356 .name = "at90pwm1",
417357 .llvm_name = "at90pwm1",
418 .features = featureSet(&[_]Feature{
358 .features = featureSet(&all_features, &[_]Feature{
419359 .avr4,
420360 }),
421361 };
422362 pub const at90pwm161 = Cpu{
423363 .name = "at90pwm161",
424364 .llvm_name = "at90pwm161",
425 .features = featureSet(&[_]Feature{
365 .features = featureSet(&all_features, &[_]Feature{
426366 .avr5,
427367 }),
428368 };
429369 pub const at90pwm2 = Cpu{
430370 .name = "at90pwm2",
431371 .llvm_name = "at90pwm2",
432 .features = featureSet(&[_]Feature{
372 .features = featureSet(&all_features, &[_]Feature{
433373 .avr4,
434374 }),
435375 };
436376 pub const at90pwm216 = Cpu{
437377 .name = "at90pwm216",
438378 .llvm_name = "at90pwm216",
439 .features = featureSet(&[_]Feature{
379 .features = featureSet(&all_features, &[_]Feature{
440380 .avr5,
441381 }),
442382 };
443383 pub const at90pwm2b = Cpu{
444384 .name = "at90pwm2b",
445385 .llvm_name = "at90pwm2b",
446 .features = featureSet(&[_]Feature{
386 .features = featureSet(&all_features, &[_]Feature{
447387 .avr4,
448388 }),
449389 };
450390 pub const at90pwm3 = Cpu{
451391 .name = "at90pwm3",
452392 .llvm_name = "at90pwm3",
453 .features = featureSet(&[_]Feature{
393 .features = featureSet(&all_features, &[_]Feature{
454394 .avr4,
455395 }),
456396 };
457397 pub const at90pwm316 = Cpu{
458398 .name = "at90pwm316",
459399 .llvm_name = "at90pwm316",
460 .features = featureSet(&[_]Feature{
400 .features = featureSet(&all_features, &[_]Feature{
461401 .avr5,
462402 }),
463403 };
464404 pub const at90pwm3b = Cpu{
465405 .name = "at90pwm3b",
466406 .llvm_name = "at90pwm3b",
467 .features = featureSet(&[_]Feature{
407 .features = featureSet(&all_features, &[_]Feature{
468408 .avr4,
469409 }),
470410 };
471411 pub const at90pwm81 = Cpu{
472412 .name = "at90pwm81",
473413 .llvm_name = "at90pwm81",
474 .features = featureSet(&[_]Feature{
414 .features = featureSet(&all_features, &[_]Feature{
475415 .avr4,
476416 }),
477417 };
478418 pub const at90s1200 = Cpu{
479419 .name = "at90s1200",
480420 .llvm_name = "at90s1200",
481 .features = featureSet(&[_]Feature{
421 .features = featureSet(&all_features, &[_]Feature{
482422 .avr0,
483423 }),
484424 };
485425 pub const at90s2313 = Cpu{
486426 .name = "at90s2313",
487427 .llvm_name = "at90s2313",
488 .features = featureSet(&[_]Feature{
428 .features = featureSet(&all_features, &[_]Feature{
489429 .avr2,
490430 }),
491431 };
492432 pub const at90s2323 = Cpu{
493433 .name = "at90s2323",
494434 .llvm_name = "at90s2323",
495 .features = featureSet(&[_]Feature{
435 .features = featureSet(&all_features, &[_]Feature{
496436 .avr2,
497437 }),
498438 };
499439 pub const at90s2333 = Cpu{
500440 .name = "at90s2333",
501441 .llvm_name = "at90s2333",
502 .features = featureSet(&[_]Feature{
442 .features = featureSet(&all_features, &[_]Feature{
503443 .avr2,
504444 }),
505445 };
506446 pub const at90s2343 = Cpu{
507447 .name = "at90s2343",
508448 .llvm_name = "at90s2343",
509 .features = featureSet(&[_]Feature{
449 .features = featureSet(&all_features, &[_]Feature{
510450 .avr2,
511451 }),
512452 };
513453 pub const at90s4414 = Cpu{
514454 .name = "at90s4414",
515455 .llvm_name = "at90s4414",
516 .features = featureSet(&[_]Feature{
456 .features = featureSet(&all_features, &[_]Feature{
517457 .avr2,
518458 }),
519459 };
520460 pub const at90s4433 = Cpu{
521461 .name = "at90s4433",
522462 .llvm_name = "at90s4433",
523 .features = featureSet(&[_]Feature{
463 .features = featureSet(&all_features, &[_]Feature{
524464 .avr2,
525465 }),
526466 };
527467 pub const at90s4434 = Cpu{
528468 .name = "at90s4434",
529469 .llvm_name = "at90s4434",
530 .features = featureSet(&[_]Feature{
470 .features = featureSet(&all_features, &[_]Feature{
531471 .avr2,
532472 }),
533473 };
534474 pub const at90s8515 = Cpu{
535475 .name = "at90s8515",
536476 .llvm_name = "at90s8515",
537 .features = featureSet(&[_]Feature{
477 .features = featureSet(&all_features, &[_]Feature{
538478 .avr2,
539479 }),
540480 };
541481 pub const at90s8535 = Cpu{
542482 .name = "at90s8535",
543483 .llvm_name = "at90s8535",
544 .features = featureSet(&[_]Feature{
484 .features = featureSet(&all_features, &[_]Feature{
545485 .avr2,
546486 }),
547487 };
548488 pub const at90scr100 = Cpu{
549489 .name = "at90scr100",
550490 .llvm_name = "at90scr100",
551 .features = featureSet(&[_]Feature{
491 .features = featureSet(&all_features, &[_]Feature{
552492 .avr5,
553493 }),
554494 };
555495 pub const at90usb1286 = Cpu{
556496 .name = "at90usb1286",
557497 .llvm_name = "at90usb1286",
558 .features = featureSet(&[_]Feature{
498 .features = featureSet(&all_features, &[_]Feature{
559499 .avr51,
560500 }),
561501 };
562502 pub const at90usb1287 = Cpu{
563503 .name = "at90usb1287",
564504 .llvm_name = "at90usb1287",
565 .features = featureSet(&[_]Feature{
505 .features = featureSet(&all_features, &[_]Feature{
566506 .avr51,
567507 }),
568508 };
569509 pub const at90usb162 = Cpu{
570510 .name = "at90usb162",
571511 .llvm_name = "at90usb162",
572 .features = featureSet(&[_]Feature{
512 .features = featureSet(&all_features, &[_]Feature{
573513 .avr35,
574514 }),
575515 };
576516 pub const at90usb646 = Cpu{
577517 .name = "at90usb646",
578518 .llvm_name = "at90usb646",
579 .features = featureSet(&[_]Feature{
519 .features = featureSet(&all_features, &[_]Feature{
580520 .avr5,
581521 }),
582522 };
583523 pub const at90usb647 = Cpu{
584524 .name = "at90usb647",
585525 .llvm_name = "at90usb647",
586 .features = featureSet(&[_]Feature{
526 .features = featureSet(&all_features, &[_]Feature{
587527 .avr5,
588528 }),
589529 };
590530 pub const at90usb82 = Cpu{
591531 .name = "at90usb82",
592532 .llvm_name = "at90usb82",
593 .features = featureSet(&[_]Feature{
533 .features = featureSet(&all_features, &[_]Feature{
594534 .avr35,
595535 }),
596536 };
597537 pub const at94k = Cpu{
598538 .name = "at94k",
599539 .llvm_name = "at94k",
600 .features = featureSet(&[_]Feature{
540 .features = featureSet(&all_features, &[_]Feature{
601541 .avr3,
602542 .lpmx,
603543 .movw,
......@@ -607,133 +547,133 @@ pub const cpu = struct {
607547 pub const ata5272 = Cpu{
608548 .name = "ata5272",
609549 .llvm_name = "ata5272",
610 .features = featureSet(&[_]Feature{
550 .features = featureSet(&all_features, &[_]Feature{
611551 .avr25,
612552 }),
613553 };
614554 pub const ata5505 = Cpu{
615555 .name = "ata5505",
616556 .llvm_name = "ata5505",
617 .features = featureSet(&[_]Feature{
557 .features = featureSet(&all_features, &[_]Feature{
618558 .avr35,
619559 }),
620560 };
621561 pub const ata5790 = Cpu{
622562 .name = "ata5790",
623563 .llvm_name = "ata5790",
624 .features = featureSet(&[_]Feature{
564 .features = featureSet(&all_features, &[_]Feature{
625565 .avr5,
626566 }),
627567 };
628568 pub const ata5795 = Cpu{
629569 .name = "ata5795",
630570 .llvm_name = "ata5795",
631 .features = featureSet(&[_]Feature{
571 .features = featureSet(&all_features, &[_]Feature{
632572 .avr5,
633573 }),
634574 };
635575 pub const ata6285 = Cpu{
636576 .name = "ata6285",
637577 .llvm_name = "ata6285",
638 .features = featureSet(&[_]Feature{
578 .features = featureSet(&all_features, &[_]Feature{
639579 .avr4,
640580 }),
641581 };
642582 pub const ata6286 = Cpu{
643583 .name = "ata6286",
644584 .llvm_name = "ata6286",
645 .features = featureSet(&[_]Feature{
585 .features = featureSet(&all_features, &[_]Feature{
646586 .avr4,
647587 }),
648588 };
649589 pub const ata6289 = Cpu{
650590 .name = "ata6289",
651591 .llvm_name = "ata6289",
652 .features = featureSet(&[_]Feature{
592 .features = featureSet(&all_features, &[_]Feature{
653593 .avr4,
654594 }),
655595 };
656596 pub const atmega103 = Cpu{
657597 .name = "atmega103",
658598 .llvm_name = "atmega103",
659 .features = featureSet(&[_]Feature{
599 .features = featureSet(&all_features, &[_]Feature{
660600 .avr31,
661601 }),
662602 };
663603 pub const atmega128 = Cpu{
664604 .name = "atmega128",
665605 .llvm_name = "atmega128",
666 .features = featureSet(&[_]Feature{
606 .features = featureSet(&all_features, &[_]Feature{
667607 .avr51,
668608 }),
669609 };
670610 pub const atmega1280 = Cpu{
671611 .name = "atmega1280",
672612 .llvm_name = "atmega1280",
673 .features = featureSet(&[_]Feature{
613 .features = featureSet(&all_features, &[_]Feature{
674614 .avr51,
675615 }),
676616 };
677617 pub const atmega1281 = Cpu{
678618 .name = "atmega1281",
679619 .llvm_name = "atmega1281",
680 .features = featureSet(&[_]Feature{
620 .features = featureSet(&all_features, &[_]Feature{
681621 .avr51,
682622 }),
683623 };
684624 pub const atmega1284 = Cpu{
685625 .name = "atmega1284",
686626 .llvm_name = "atmega1284",
687 .features = featureSet(&[_]Feature{
627 .features = featureSet(&all_features, &[_]Feature{
688628 .avr51,
689629 }),
690630 };
691631 pub const atmega1284p = Cpu{
692632 .name = "atmega1284p",
693633 .llvm_name = "atmega1284p",
694 .features = featureSet(&[_]Feature{
634 .features = featureSet(&all_features, &[_]Feature{
695635 .avr51,
696636 }),
697637 };
698638 pub const atmega1284rfr2 = Cpu{
699639 .name = "atmega1284rfr2",
700640 .llvm_name = "atmega1284rfr2",
701 .features = featureSet(&[_]Feature{
641 .features = featureSet(&all_features, &[_]Feature{
702642 .avr51,
703643 }),
704644 };
705645 pub const atmega128a = Cpu{
706646 .name = "atmega128a",
707647 .llvm_name = "atmega128a",
708 .features = featureSet(&[_]Feature{
648 .features = featureSet(&all_features, &[_]Feature{
709649 .avr51,
710650 }),
711651 };
712652 pub const atmega128rfa1 = Cpu{
713653 .name = "atmega128rfa1",
714654 .llvm_name = "atmega128rfa1",
715 .features = featureSet(&[_]Feature{
655 .features = featureSet(&all_features, &[_]Feature{
716656 .avr51,
717657 }),
718658 };
719659 pub const atmega128rfr2 = Cpu{
720660 .name = "atmega128rfr2",
721661 .llvm_name = "atmega128rfr2",
722 .features = featureSet(&[_]Feature{
662 .features = featureSet(&all_features, &[_]Feature{
723663 .avr51,
724664 }),
725665 };
726666 pub const atmega16 = Cpu{
727667 .name = "atmega16",
728668 .llvm_name = "atmega16",
729 .features = featureSet(&[_]Feature{
669 .features = featureSet(&all_features, &[_]Feature{
730670 .avr5,
731671 }),
732672 };
733673 pub const atmega161 = Cpu{
734674 .name = "atmega161",
735675 .llvm_name = "atmega161",
736 .features = featureSet(&[_]Feature{
676 .features = featureSet(&all_features, &[_]Feature{
737677 .avr3,
738678 .lpmx,
739679 .movw,
......@@ -744,14 +684,14 @@ pub const cpu = struct {
744684 pub const atmega162 = Cpu{
745685 .name = "atmega162",
746686 .llvm_name = "atmega162",
747 .features = featureSet(&[_]Feature{
687 .features = featureSet(&all_features, &[_]Feature{
748688 .avr5,
749689 }),
750690 };
751691 pub const atmega163 = Cpu{
752692 .name = "atmega163",
753693 .llvm_name = "atmega163",
754 .features = featureSet(&[_]Feature{
694 .features = featureSet(&all_features, &[_]Feature{
755695 .avr3,
756696 .lpmx,
757697 .movw,
......@@ -762,623 +702,623 @@ pub const cpu = struct {
762702 pub const atmega164a = Cpu{
763703 .name = "atmega164a",
764704 .llvm_name = "atmega164a",
765 .features = featureSet(&[_]Feature{
705 .features = featureSet(&all_features, &[_]Feature{
766706 .avr5,
767707 }),
768708 };
769709 pub const atmega164p = Cpu{
770710 .name = "atmega164p",
771711 .llvm_name = "atmega164p",
772 .features = featureSet(&[_]Feature{
712 .features = featureSet(&all_features, &[_]Feature{
773713 .avr5,
774714 }),
775715 };
776716 pub const atmega164pa = Cpu{
777717 .name = "atmega164pa",
778718 .llvm_name = "atmega164pa",
779 .features = featureSet(&[_]Feature{
719 .features = featureSet(&all_features, &[_]Feature{
780720 .avr5,
781721 }),
782722 };
783723 pub const atmega165 = Cpu{
784724 .name = "atmega165",
785725 .llvm_name = "atmega165",
786 .features = featureSet(&[_]Feature{
726 .features = featureSet(&all_features, &[_]Feature{
787727 .avr5,
788728 }),
789729 };
790730 pub const atmega165a = Cpu{
791731 .name = "atmega165a",
792732 .llvm_name = "atmega165a",
793 .features = featureSet(&[_]Feature{
733 .features = featureSet(&all_features, &[_]Feature{
794734 .avr5,
795735 }),
796736 };
797737 pub const atmega165p = Cpu{
798738 .name = "atmega165p",
799739 .llvm_name = "atmega165p",
800 .features = featureSet(&[_]Feature{
740 .features = featureSet(&all_features, &[_]Feature{
801741 .avr5,
802742 }),
803743 };
804744 pub const atmega165pa = Cpu{
805745 .name = "atmega165pa",
806746 .llvm_name = "atmega165pa",
807 .features = featureSet(&[_]Feature{
747 .features = featureSet(&all_features, &[_]Feature{
808748 .avr5,
809749 }),
810750 };
811751 pub const atmega168 = Cpu{
812752 .name = "atmega168",
813753 .llvm_name = "atmega168",
814 .features = featureSet(&[_]Feature{
754 .features = featureSet(&all_features, &[_]Feature{
815755 .avr5,
816756 }),
817757 };
818758 pub const atmega168a = Cpu{
819759 .name = "atmega168a",
820760 .llvm_name = "atmega168a",
821 .features = featureSet(&[_]Feature{
761 .features = featureSet(&all_features, &[_]Feature{
822762 .avr5,
823763 }),
824764 };
825765 pub const atmega168p = Cpu{
826766 .name = "atmega168p",
827767 .llvm_name = "atmega168p",
828 .features = featureSet(&[_]Feature{
768 .features = featureSet(&all_features, &[_]Feature{
829769 .avr5,
830770 }),
831771 };
832772 pub const atmega168pa = Cpu{
833773 .name = "atmega168pa",
834774 .llvm_name = "atmega168pa",
835 .features = featureSet(&[_]Feature{
775 .features = featureSet(&all_features, &[_]Feature{
836776 .avr5,
837777 }),
838778 };
839779 pub const atmega169 = Cpu{
840780 .name = "atmega169",
841781 .llvm_name = "atmega169",
842 .features = featureSet(&[_]Feature{
782 .features = featureSet(&all_features, &[_]Feature{
843783 .avr5,
844784 }),
845785 };
846786 pub const atmega169a = Cpu{
847787 .name = "atmega169a",
848788 .llvm_name = "atmega169a",
849 .features = featureSet(&[_]Feature{
789 .features = featureSet(&all_features, &[_]Feature{
850790 .avr5,
851791 }),
852792 };
853793 pub const atmega169p = Cpu{
854794 .name = "atmega169p",
855795 .llvm_name = "atmega169p",
856 .features = featureSet(&[_]Feature{
796 .features = featureSet(&all_features, &[_]Feature{
857797 .avr5,
858798 }),
859799 };
860800 pub const atmega169pa = Cpu{
861801 .name = "atmega169pa",
862802 .llvm_name = "atmega169pa",
863 .features = featureSet(&[_]Feature{
803 .features = featureSet(&all_features, &[_]Feature{
864804 .avr5,
865805 }),
866806 };
867807 pub const atmega16a = Cpu{
868808 .name = "atmega16a",
869809 .llvm_name = "atmega16a",
870 .features = featureSet(&[_]Feature{
810 .features = featureSet(&all_features, &[_]Feature{
871811 .avr5,
872812 }),
873813 };
874814 pub const atmega16hva = Cpu{
875815 .name = "atmega16hva",
876816 .llvm_name = "atmega16hva",
877 .features = featureSet(&[_]Feature{
817 .features = featureSet(&all_features, &[_]Feature{
878818 .avr5,
879819 }),
880820 };
881821 pub const atmega16hva2 = Cpu{
882822 .name = "atmega16hva2",
883823 .llvm_name = "atmega16hva2",
884 .features = featureSet(&[_]Feature{
824 .features = featureSet(&all_features, &[_]Feature{
885825 .avr5,
886826 }),
887827 };
888828 pub const atmega16hvb = Cpu{
889829 .name = "atmega16hvb",
890830 .llvm_name = "atmega16hvb",
891 .features = featureSet(&[_]Feature{
831 .features = featureSet(&all_features, &[_]Feature{
892832 .avr5,
893833 }),
894834 };
895835 pub const atmega16hvbrevb = Cpu{
896836 .name = "atmega16hvbrevb",
897837 .llvm_name = "atmega16hvbrevb",
898 .features = featureSet(&[_]Feature{
838 .features = featureSet(&all_features, &[_]Feature{
899839 .avr5,
900840 }),
901841 };
902842 pub const atmega16m1 = Cpu{
903843 .name = "atmega16m1",
904844 .llvm_name = "atmega16m1",
905 .features = featureSet(&[_]Feature{
845 .features = featureSet(&all_features, &[_]Feature{
906846 .avr5,
907847 }),
908848 };
909849 pub const atmega16u2 = Cpu{
910850 .name = "atmega16u2",
911851 .llvm_name = "atmega16u2",
912 .features = featureSet(&[_]Feature{
852 .features = featureSet(&all_features, &[_]Feature{
913853 .avr35,
914854 }),
915855 };
916856 pub const atmega16u4 = Cpu{
917857 .name = "atmega16u4",
918858 .llvm_name = "atmega16u4",
919 .features = featureSet(&[_]Feature{
859 .features = featureSet(&all_features, &[_]Feature{
920860 .avr5,
921861 }),
922862 };
923863 pub const atmega2560 = Cpu{
924864 .name = "atmega2560",
925865 .llvm_name = "atmega2560",
926 .features = featureSet(&[_]Feature{
866 .features = featureSet(&all_features, &[_]Feature{
927867 .avr6,
928868 }),
929869 };
930870 pub const atmega2561 = Cpu{
931871 .name = "atmega2561",
932872 .llvm_name = "atmega2561",
933 .features = featureSet(&[_]Feature{
873 .features = featureSet(&all_features, &[_]Feature{
934874 .avr6,
935875 }),
936876 };
937877 pub const atmega2564rfr2 = Cpu{
938878 .name = "atmega2564rfr2",
939879 .llvm_name = "atmega2564rfr2",
940 .features = featureSet(&[_]Feature{
880 .features = featureSet(&all_features, &[_]Feature{
941881 .avr6,
942882 }),
943883 };
944884 pub const atmega256rfr2 = Cpu{
945885 .name = "atmega256rfr2",
946886 .llvm_name = "atmega256rfr2",
947 .features = featureSet(&[_]Feature{
887 .features = featureSet(&all_features, &[_]Feature{
948888 .avr6,
949889 }),
950890 };
951891 pub const atmega32 = Cpu{
952892 .name = "atmega32",
953893 .llvm_name = "atmega32",
954 .features = featureSet(&[_]Feature{
894 .features = featureSet(&all_features, &[_]Feature{
955895 .avr5,
956896 }),
957897 };
958898 pub const atmega323 = Cpu{
959899 .name = "atmega323",
960900 .llvm_name = "atmega323",
961 .features = featureSet(&[_]Feature{
901 .features = featureSet(&all_features, &[_]Feature{
962902 .avr5,
963903 }),
964904 };
965905 pub const atmega324a = Cpu{
966906 .name = "atmega324a",
967907 .llvm_name = "atmega324a",
968 .features = featureSet(&[_]Feature{
908 .features = featureSet(&all_features, &[_]Feature{
969909 .avr5,
970910 }),
971911 };
972912 pub const atmega324p = Cpu{
973913 .name = "atmega324p",
974914 .llvm_name = "atmega324p",
975 .features = featureSet(&[_]Feature{
915 .features = featureSet(&all_features, &[_]Feature{
976916 .avr5,
977917 }),
978918 };
979919 pub const atmega324pa = Cpu{
980920 .name = "atmega324pa",
981921 .llvm_name = "atmega324pa",
982 .features = featureSet(&[_]Feature{
922 .features = featureSet(&all_features, &[_]Feature{
983923 .avr5,
984924 }),
985925 };
986926 pub const atmega325 = Cpu{
987927 .name = "atmega325",
988928 .llvm_name = "atmega325",
989 .features = featureSet(&[_]Feature{
929 .features = featureSet(&all_features, &[_]Feature{
990930 .avr5,
991931 }),
992932 };
993933 pub const atmega3250 = Cpu{
994934 .name = "atmega3250",
995935 .llvm_name = "atmega3250",
996 .features = featureSet(&[_]Feature{
936 .features = featureSet(&all_features, &[_]Feature{
997937 .avr5,
998938 }),
999939 };
1000940 pub const atmega3250a = Cpu{
1001941 .name = "atmega3250a",
1002942 .llvm_name = "atmega3250a",
1003 .features = featureSet(&[_]Feature{
943 .features = featureSet(&all_features, &[_]Feature{
1004944 .avr5,
1005945 }),
1006946 };
1007947 pub const atmega3250p = Cpu{
1008948 .name = "atmega3250p",
1009949 .llvm_name = "atmega3250p",
1010 .features = featureSet(&[_]Feature{
950 .features = featureSet(&all_features, &[_]Feature{
1011951 .avr5,
1012952 }),
1013953 };
1014954 pub const atmega3250pa = Cpu{
1015955 .name = "atmega3250pa",
1016956 .llvm_name = "atmega3250pa",
1017 .features = featureSet(&[_]Feature{
957 .features = featureSet(&all_features, &[_]Feature{
1018958 .avr5,
1019959 }),
1020960 };
1021961 pub const atmega325a = Cpu{
1022962 .name = "atmega325a",
1023963 .llvm_name = "atmega325a",
1024 .features = featureSet(&[_]Feature{
964 .features = featureSet(&all_features, &[_]Feature{
1025965 .avr5,
1026966 }),
1027967 };
1028968 pub const atmega325p = Cpu{
1029969 .name = "atmega325p",
1030970 .llvm_name = "atmega325p",
1031 .features = featureSet(&[_]Feature{
971 .features = featureSet(&all_features, &[_]Feature{
1032972 .avr5,
1033973 }),
1034974 };
1035975 pub const atmega325pa = Cpu{
1036976 .name = "atmega325pa",
1037977 .llvm_name = "atmega325pa",
1038 .features = featureSet(&[_]Feature{
978 .features = featureSet(&all_features, &[_]Feature{
1039979 .avr5,
1040980 }),
1041981 };
1042982 pub const atmega328 = Cpu{
1043983 .name = "atmega328",
1044984 .llvm_name = "atmega328",
1045 .features = featureSet(&[_]Feature{
985 .features = featureSet(&all_features, &[_]Feature{
1046986 .avr5,
1047987 }),
1048988 };
1049989 pub const atmega328p = Cpu{
1050990 .name = "atmega328p",
1051991 .llvm_name = "atmega328p",
1052 .features = featureSet(&[_]Feature{
992 .features = featureSet(&all_features, &[_]Feature{
1053993 .avr5,
1054994 }),
1055995 };
1056996 pub const atmega329 = Cpu{
1057997 .name = "atmega329",
1058998 .llvm_name = "atmega329",
1059 .features = featureSet(&[_]Feature{
999 .features = featureSet(&all_features, &[_]Feature{
10601000 .avr5,
10611001 }),
10621002 };
10631003 pub const atmega3290 = Cpu{
10641004 .name = "atmega3290",
10651005 .llvm_name = "atmega3290",
1066 .features = featureSet(&[_]Feature{
1006 .features = featureSet(&all_features, &[_]Feature{
10671007 .avr5,
10681008 }),
10691009 };
10701010 pub const atmega3290a = Cpu{
10711011 .name = "atmega3290a",
10721012 .llvm_name = "atmega3290a",
1073 .features = featureSet(&[_]Feature{
1013 .features = featureSet(&all_features, &[_]Feature{
10741014 .avr5,
10751015 }),
10761016 };
10771017 pub const atmega3290p = Cpu{
10781018 .name = "atmega3290p",
10791019 .llvm_name = "atmega3290p",
1080 .features = featureSet(&[_]Feature{
1020 .features = featureSet(&all_features, &[_]Feature{
10811021 .avr5,
10821022 }),
10831023 };
10841024 pub const atmega3290pa = Cpu{
10851025 .name = "atmega3290pa",
10861026 .llvm_name = "atmega3290pa",
1087 .features = featureSet(&[_]Feature{
1027 .features = featureSet(&all_features, &[_]Feature{
10881028 .avr5,
10891029 }),
10901030 };
10911031 pub const atmega329a = Cpu{
10921032 .name = "atmega329a",
10931033 .llvm_name = "atmega329a",
1094 .features = featureSet(&[_]Feature{
1034 .features = featureSet(&all_features, &[_]Feature{
10951035 .avr5,
10961036 }),
10971037 };
10981038 pub const atmega329p = Cpu{
10991039 .name = "atmega329p",
11001040 .llvm_name = "atmega329p",
1101 .features = featureSet(&[_]Feature{
1041 .features = featureSet(&all_features, &[_]Feature{
11021042 .avr5,
11031043 }),
11041044 };
11051045 pub const atmega329pa = Cpu{
11061046 .name = "atmega329pa",
11071047 .llvm_name = "atmega329pa",
1108 .features = featureSet(&[_]Feature{
1048 .features = featureSet(&all_features, &[_]Feature{
11091049 .avr5,
11101050 }),
11111051 };
11121052 pub const atmega32a = Cpu{
11131053 .name = "atmega32a",
11141054 .llvm_name = "atmega32a",
1115 .features = featureSet(&[_]Feature{
1055 .features = featureSet(&all_features, &[_]Feature{
11161056 .avr5,
11171057 }),
11181058 };
11191059 pub const atmega32c1 = Cpu{
11201060 .name = "atmega32c1",
11211061 .llvm_name = "atmega32c1",
1122 .features = featureSet(&[_]Feature{
1062 .features = featureSet(&all_features, &[_]Feature{
11231063 .avr5,
11241064 }),
11251065 };
11261066 pub const atmega32hvb = Cpu{
11271067 .name = "atmega32hvb",
11281068 .llvm_name = "atmega32hvb",
1129 .features = featureSet(&[_]Feature{
1069 .features = featureSet(&all_features, &[_]Feature{
11301070 .avr5,
11311071 }),
11321072 };
11331073 pub const atmega32hvbrevb = Cpu{
11341074 .name = "atmega32hvbrevb",
11351075 .llvm_name = "atmega32hvbrevb",
1136 .features = featureSet(&[_]Feature{
1076 .features = featureSet(&all_features, &[_]Feature{
11371077 .avr5,
11381078 }),
11391079 };
11401080 pub const atmega32m1 = Cpu{
11411081 .name = "atmega32m1",
11421082 .llvm_name = "atmega32m1",
1143 .features = featureSet(&[_]Feature{
1083 .features = featureSet(&all_features, &[_]Feature{
11441084 .avr5,
11451085 }),
11461086 };
11471087 pub const atmega32u2 = Cpu{
11481088 .name = "atmega32u2",
11491089 .llvm_name = "atmega32u2",
1150 .features = featureSet(&[_]Feature{
1090 .features = featureSet(&all_features, &[_]Feature{
11511091 .avr35,
11521092 }),
11531093 };
11541094 pub const atmega32u4 = Cpu{
11551095 .name = "atmega32u4",
11561096 .llvm_name = "atmega32u4",
1157 .features = featureSet(&[_]Feature{
1097 .features = featureSet(&all_features, &[_]Feature{
11581098 .avr5,
11591099 }),
11601100 };
11611101 pub const atmega32u6 = Cpu{
11621102 .name = "atmega32u6",
11631103 .llvm_name = "atmega32u6",
1164 .features = featureSet(&[_]Feature{
1104 .features = featureSet(&all_features, &[_]Feature{
11651105 .avr5,
11661106 }),
11671107 };
11681108 pub const atmega406 = Cpu{
11691109 .name = "atmega406",
11701110 .llvm_name = "atmega406",
1171 .features = featureSet(&[_]Feature{
1111 .features = featureSet(&all_features, &[_]Feature{
11721112 .avr5,
11731113 }),
11741114 };
11751115 pub const atmega48 = Cpu{
11761116 .name = "atmega48",
11771117 .llvm_name = "atmega48",
1178 .features = featureSet(&[_]Feature{
1118 .features = featureSet(&all_features, &[_]Feature{
11791119 .avr4,
11801120 }),
11811121 };
11821122 pub const atmega48a = Cpu{
11831123 .name = "atmega48a",
11841124 .llvm_name = "atmega48a",
1185 .features = featureSet(&[_]Feature{
1125 .features = featureSet(&all_features, &[_]Feature{
11861126 .avr4,
11871127 }),
11881128 };
11891129 pub const atmega48p = Cpu{
11901130 .name = "atmega48p",
11911131 .llvm_name = "atmega48p",
1192 .features = featureSet(&[_]Feature{
1132 .features = featureSet(&all_features, &[_]Feature{
11931133 .avr4,
11941134 }),
11951135 };
11961136 pub const atmega48pa = Cpu{
11971137 .name = "atmega48pa",
11981138 .llvm_name = "atmega48pa",
1199 .features = featureSet(&[_]Feature{
1139 .features = featureSet(&all_features, &[_]Feature{
12001140 .avr4,
12011141 }),
12021142 };
12031143 pub const atmega64 = Cpu{
12041144 .name = "atmega64",
12051145 .llvm_name = "atmega64",
1206 .features = featureSet(&[_]Feature{
1146 .features = featureSet(&all_features, &[_]Feature{
12071147 .avr5,
12081148 }),
12091149 };
12101150 pub const atmega640 = Cpu{
12111151 .name = "atmega640",
12121152 .llvm_name = "atmega640",
1213 .features = featureSet(&[_]Feature{
1153 .features = featureSet(&all_features, &[_]Feature{
12141154 .avr5,
12151155 }),
12161156 };
12171157 pub const atmega644 = Cpu{
12181158 .name = "atmega644",
12191159 .llvm_name = "atmega644",
1220 .features = featureSet(&[_]Feature{
1160 .features = featureSet(&all_features, &[_]Feature{
12211161 .avr5,
12221162 }),
12231163 };
12241164 pub const atmega644a = Cpu{
12251165 .name = "atmega644a",
12261166 .llvm_name = "atmega644a",
1227 .features = featureSet(&[_]Feature{
1167 .features = featureSet(&all_features, &[_]Feature{
12281168 .avr5,
12291169 }),
12301170 };
12311171 pub const atmega644p = Cpu{
12321172 .name = "atmega644p",
12331173 .llvm_name = "atmega644p",
1234 .features = featureSet(&[_]Feature{
1174 .features = featureSet(&all_features, &[_]Feature{
12351175 .avr5,
12361176 }),
12371177 };
12381178 pub const atmega644pa = Cpu{
12391179 .name = "atmega644pa",
12401180 .llvm_name = "atmega644pa",
1241 .features = featureSet(&[_]Feature{
1181 .features = featureSet(&all_features, &[_]Feature{
12421182 .avr5,
12431183 }),
12441184 };
12451185 pub const atmega644rfr2 = Cpu{
12461186 .name = "atmega644rfr2",
12471187 .llvm_name = "atmega644rfr2",
1248 .features = featureSet(&[_]Feature{
1188 .features = featureSet(&all_features, &[_]Feature{
12491189 .avr5,
12501190 }),
12511191 };
12521192 pub const atmega645 = Cpu{
12531193 .name = "atmega645",
12541194 .llvm_name = "atmega645",
1255 .features = featureSet(&[_]Feature{
1195 .features = featureSet(&all_features, &[_]Feature{
12561196 .avr5,
12571197 }),
12581198 };
12591199 pub const atmega6450 = Cpu{
12601200 .name = "atmega6450",
12611201 .llvm_name = "atmega6450",
1262 .features = featureSet(&[_]Feature{
1202 .features = featureSet(&all_features, &[_]Feature{
12631203 .avr5,
12641204 }),
12651205 };
12661206 pub const atmega6450a = Cpu{
12671207 .name = "atmega6450a",
12681208 .llvm_name = "atmega6450a",
1269 .features = featureSet(&[_]Feature{
1209 .features = featureSet(&all_features, &[_]Feature{
12701210 .avr5,
12711211 }),
12721212 };
12731213 pub const atmega6450p = Cpu{
12741214 .name = "atmega6450p",
12751215 .llvm_name = "atmega6450p",
1276 .features = featureSet(&[_]Feature{
1216 .features = featureSet(&all_features, &[_]Feature{
12771217 .avr5,
12781218 }),
12791219 };
12801220 pub const atmega645a = Cpu{
12811221 .name = "atmega645a",
12821222 .llvm_name = "atmega645a",
1283 .features = featureSet(&[_]Feature{
1223 .features = featureSet(&all_features, &[_]Feature{
12841224 .avr5,
12851225 }),
12861226 };
12871227 pub const atmega645p = Cpu{
12881228 .name = "atmega645p",
12891229 .llvm_name = "atmega645p",
1290 .features = featureSet(&[_]Feature{
1230 .features = featureSet(&all_features, &[_]Feature{
12911231 .avr5,
12921232 }),
12931233 };
12941234 pub const atmega649 = Cpu{
12951235 .name = "atmega649",
12961236 .llvm_name = "atmega649",
1297 .features = featureSet(&[_]Feature{
1237 .features = featureSet(&all_features, &[_]Feature{
12981238 .avr5,
12991239 }),
13001240 };
13011241 pub const atmega6490 = Cpu{
13021242 .name = "atmega6490",
13031243 .llvm_name = "atmega6490",
1304 .features = featureSet(&[_]Feature{
1244 .features = featureSet(&all_features, &[_]Feature{
13051245 .avr5,
13061246 }),
13071247 };
13081248 pub const atmega6490a = Cpu{
13091249 .name = "atmega6490a",
13101250 .llvm_name = "atmega6490a",
1311 .features = featureSet(&[_]Feature{
1251 .features = featureSet(&all_features, &[_]Feature{
13121252 .avr5,
13131253 }),
13141254 };
13151255 pub const atmega6490p = Cpu{
13161256 .name = "atmega6490p",
13171257 .llvm_name = "atmega6490p",
1318 .features = featureSet(&[_]Feature{
1258 .features = featureSet(&all_features, &[_]Feature{
13191259 .avr5,
13201260 }),
13211261 };
13221262 pub const atmega649a = Cpu{
13231263 .name = "atmega649a",
13241264 .llvm_name = "atmega649a",
1325 .features = featureSet(&[_]Feature{
1265 .features = featureSet(&all_features, &[_]Feature{
13261266 .avr5,
13271267 }),
13281268 };
13291269 pub const atmega649p = Cpu{
13301270 .name = "atmega649p",
13311271 .llvm_name = "atmega649p",
1332 .features = featureSet(&[_]Feature{
1272 .features = featureSet(&all_features, &[_]Feature{
13331273 .avr5,
13341274 }),
13351275 };
13361276 pub const atmega64a = Cpu{
13371277 .name = "atmega64a",
13381278 .llvm_name = "atmega64a",
1339 .features = featureSet(&[_]Feature{
1279 .features = featureSet(&all_features, &[_]Feature{
13401280 .avr5,
13411281 }),
13421282 };
13431283 pub const atmega64c1 = Cpu{
13441284 .name = "atmega64c1",
13451285 .llvm_name = "atmega64c1",
1346 .features = featureSet(&[_]Feature{
1286 .features = featureSet(&all_features, &[_]Feature{
13471287 .avr5,
13481288 }),
13491289 };
13501290 pub const atmega64hve = Cpu{
13511291 .name = "atmega64hve",
13521292 .llvm_name = "atmega64hve",
1353 .features = featureSet(&[_]Feature{
1293 .features = featureSet(&all_features, &[_]Feature{
13541294 .avr5,
13551295 }),
13561296 };
13571297 pub const atmega64m1 = Cpu{
13581298 .name = "atmega64m1",
13591299 .llvm_name = "atmega64m1",
1360 .features = featureSet(&[_]Feature{
1300 .features = featureSet(&all_features, &[_]Feature{
13611301 .avr5,
13621302 }),
13631303 };
13641304 pub const atmega64rfr2 = Cpu{
13651305 .name = "atmega64rfr2",
13661306 .llvm_name = "atmega64rfr2",
1367 .features = featureSet(&[_]Feature{
1307 .features = featureSet(&all_features, &[_]Feature{
13681308 .avr5,
13691309 }),
13701310 };
13711311 pub const atmega8 = Cpu{
13721312 .name = "atmega8",
13731313 .llvm_name = "atmega8",
1374 .features = featureSet(&[_]Feature{
1314 .features = featureSet(&all_features, &[_]Feature{
13751315 .avr4,
13761316 }),
13771317 };
13781318 pub const atmega8515 = Cpu{
13791319 .name = "atmega8515",
13801320 .llvm_name = "atmega8515",
1381 .features = featureSet(&[_]Feature{
1321 .features = featureSet(&all_features, &[_]Feature{
13821322 .avr2,
13831323 .lpmx,
13841324 .movw,
......@@ -1389,7 +1329,7 @@ pub const cpu = struct {
13891329 pub const atmega8535 = Cpu{
13901330 .name = "atmega8535",
13911331 .llvm_name = "atmega8535",
1392 .features = featureSet(&[_]Feature{
1332 .features = featureSet(&all_features, &[_]Feature{
13931333 .avr2,
13941334 .lpmx,
13951335 .movw,
......@@ -1400,175 +1340,175 @@ pub const cpu = struct {
14001340 pub const atmega88 = Cpu{
14011341 .name = "atmega88",
14021342 .llvm_name = "atmega88",
1403 .features = featureSet(&[_]Feature{
1343 .features = featureSet(&all_features, &[_]Feature{
14041344 .avr4,
14051345 }),
14061346 };
14071347 pub const atmega88a = Cpu{
14081348 .name = "atmega88a",
14091349 .llvm_name = "atmega88a",
1410 .features = featureSet(&[_]Feature{
1350 .features = featureSet(&all_features, &[_]Feature{
14111351 .avr4,
14121352 }),
14131353 };
14141354 pub const atmega88p = Cpu{
14151355 .name = "atmega88p",
14161356 .llvm_name = "atmega88p",
1417 .features = featureSet(&[_]Feature{
1357 .features = featureSet(&all_features, &[_]Feature{
14181358 .avr4,
14191359 }),
14201360 };
14211361 pub const atmega88pa = Cpu{
14221362 .name = "atmega88pa",
14231363 .llvm_name = "atmega88pa",
1424 .features = featureSet(&[_]Feature{
1364 .features = featureSet(&all_features, &[_]Feature{
14251365 .avr4,
14261366 }),
14271367 };
14281368 pub const atmega8a = Cpu{
14291369 .name = "atmega8a",
14301370 .llvm_name = "atmega8a",
1431 .features = featureSet(&[_]Feature{
1371 .features = featureSet(&all_features, &[_]Feature{
14321372 .avr4,
14331373 }),
14341374 };
14351375 pub const atmega8hva = Cpu{
14361376 .name = "atmega8hva",
14371377 .llvm_name = "atmega8hva",
1438 .features = featureSet(&[_]Feature{
1378 .features = featureSet(&all_features, &[_]Feature{
14391379 .avr4,
14401380 }),
14411381 };
14421382 pub const atmega8u2 = Cpu{
14431383 .name = "atmega8u2",
14441384 .llvm_name = "atmega8u2",
1445 .features = featureSet(&[_]Feature{
1385 .features = featureSet(&all_features, &[_]Feature{
14461386 .avr35,
14471387 }),
14481388 };
14491389 pub const attiny10 = Cpu{
14501390 .name = "attiny10",
14511391 .llvm_name = "attiny10",
1452 .features = featureSet(&[_]Feature{
1392 .features = featureSet(&all_features, &[_]Feature{
14531393 .avrtiny,
14541394 }),
14551395 };
14561396 pub const attiny102 = Cpu{
14571397 .name = "attiny102",
14581398 .llvm_name = "attiny102",
1459 .features = featureSet(&[_]Feature{
1399 .features = featureSet(&all_features, &[_]Feature{
14601400 .avrtiny,
14611401 }),
14621402 };
14631403 pub const attiny104 = Cpu{
14641404 .name = "attiny104",
14651405 .llvm_name = "attiny104",
1466 .features = featureSet(&[_]Feature{
1406 .features = featureSet(&all_features, &[_]Feature{
14671407 .avrtiny,
14681408 }),
14691409 };
14701410 pub const attiny11 = Cpu{
14711411 .name = "attiny11",
14721412 .llvm_name = "attiny11",
1473 .features = featureSet(&[_]Feature{
1413 .features = featureSet(&all_features, &[_]Feature{
14741414 .avr1,
14751415 }),
14761416 };
14771417 pub const attiny12 = Cpu{
14781418 .name = "attiny12",
14791419 .llvm_name = "attiny12",
1480 .features = featureSet(&[_]Feature{
1420 .features = featureSet(&all_features, &[_]Feature{
14811421 .avr1,
14821422 }),
14831423 };
14841424 pub const attiny13 = Cpu{
14851425 .name = "attiny13",
14861426 .llvm_name = "attiny13",
1487 .features = featureSet(&[_]Feature{
1427 .features = featureSet(&all_features, &[_]Feature{
14881428 .avr25,
14891429 }),
14901430 };
14911431 pub const attiny13a = Cpu{
14921432 .name = "attiny13a",
14931433 .llvm_name = "attiny13a",
1494 .features = featureSet(&[_]Feature{
1434 .features = featureSet(&all_features, &[_]Feature{
14951435 .avr25,
14961436 }),
14971437 };
14981438 pub const attiny15 = Cpu{
14991439 .name = "attiny15",
15001440 .llvm_name = "attiny15",
1501 .features = featureSet(&[_]Feature{
1441 .features = featureSet(&all_features, &[_]Feature{
15021442 .avr1,
15031443 }),
15041444 };
15051445 pub const attiny1634 = Cpu{
15061446 .name = "attiny1634",
15071447 .llvm_name = "attiny1634",
1508 .features = featureSet(&[_]Feature{
1448 .features = featureSet(&all_features, &[_]Feature{
15091449 .avr35,
15101450 }),
15111451 };
15121452 pub const attiny167 = Cpu{
15131453 .name = "attiny167",
15141454 .llvm_name = "attiny167",
1515 .features = featureSet(&[_]Feature{
1455 .features = featureSet(&all_features, &[_]Feature{
15161456 .avr35,
15171457 }),
15181458 };
15191459 pub const attiny20 = Cpu{
15201460 .name = "attiny20",
15211461 .llvm_name = "attiny20",
1522 .features = featureSet(&[_]Feature{
1462 .features = featureSet(&all_features, &[_]Feature{
15231463 .avrtiny,
15241464 }),
15251465 };
15261466 pub const attiny22 = Cpu{
15271467 .name = "attiny22",
15281468 .llvm_name = "attiny22",
1529 .features = featureSet(&[_]Feature{
1469 .features = featureSet(&all_features, &[_]Feature{
15301470 .avr2,
15311471 }),
15321472 };
15331473 pub const attiny2313 = Cpu{
15341474 .name = "attiny2313",
15351475 .llvm_name = "attiny2313",
1536 .features = featureSet(&[_]Feature{
1476 .features = featureSet(&all_features, &[_]Feature{
15371477 .avr25,
15381478 }),
15391479 };
15401480 pub const attiny2313a = Cpu{
15411481 .name = "attiny2313a",
15421482 .llvm_name = "attiny2313a",
1543 .features = featureSet(&[_]Feature{
1483 .features = featureSet(&all_features, &[_]Feature{
15441484 .avr25,
15451485 }),
15461486 };
15471487 pub const attiny24 = Cpu{
15481488 .name = "attiny24",
15491489 .llvm_name = "attiny24",
1550 .features = featureSet(&[_]Feature{
1490 .features = featureSet(&all_features, &[_]Feature{
15511491 .avr25,
15521492 }),
15531493 };
15541494 pub const attiny24a = Cpu{
15551495 .name = "attiny24a",
15561496 .llvm_name = "attiny24a",
1557 .features = featureSet(&[_]Feature{
1497 .features = featureSet(&all_features, &[_]Feature{
15581498 .avr25,
15591499 }),
15601500 };
15611501 pub const attiny25 = Cpu{
15621502 .name = "attiny25",
15631503 .llvm_name = "attiny25",
1564 .features = featureSet(&[_]Feature{
1504 .features = featureSet(&all_features, &[_]Feature{
15651505 .avr25,
15661506 }),
15671507 };
15681508 pub const attiny26 = Cpu{
15691509 .name = "attiny26",
15701510 .llvm_name = "attiny26",
1571 .features = featureSet(&[_]Feature{
1511 .features = featureSet(&all_features, &[_]Feature{
15721512 .avr2,
15731513 .lpmx,
15741514 }),
......@@ -1576,602 +1516,602 @@ pub const cpu = struct {
15761516 pub const attiny261 = Cpu{
15771517 .name = "attiny261",
15781518 .llvm_name = "attiny261",
1579 .features = featureSet(&[_]Feature{
1519 .features = featureSet(&all_features, &[_]Feature{
15801520 .avr25,
15811521 }),
15821522 };
15831523 pub const attiny261a = Cpu{
15841524 .name = "attiny261a",
15851525 .llvm_name = "attiny261a",
1586 .features = featureSet(&[_]Feature{
1526 .features = featureSet(&all_features, &[_]Feature{
15871527 .avr25,
15881528 }),
15891529 };
15901530 pub const attiny28 = Cpu{
15911531 .name = "attiny28",
15921532 .llvm_name = "attiny28",
1593 .features = featureSet(&[_]Feature{
1533 .features = featureSet(&all_features, &[_]Feature{
15941534 .avr1,
15951535 }),
15961536 };
15971537 pub const attiny4 = Cpu{
15981538 .name = "attiny4",
15991539 .llvm_name = "attiny4",
1600 .features = featureSet(&[_]Feature{
1540 .features = featureSet(&all_features, &[_]Feature{
16011541 .avrtiny,
16021542 }),
16031543 };
16041544 pub const attiny40 = Cpu{
16051545 .name = "attiny40",
16061546 .llvm_name = "attiny40",
1607 .features = featureSet(&[_]Feature{
1547 .features = featureSet(&all_features, &[_]Feature{
16081548 .avrtiny,
16091549 }),
16101550 };
16111551 pub const attiny4313 = Cpu{
16121552 .name = "attiny4313",
16131553 .llvm_name = "attiny4313",
1614 .features = featureSet(&[_]Feature{
1554 .features = featureSet(&all_features, &[_]Feature{
16151555 .avr25,
16161556 }),
16171557 };
16181558 pub const attiny43u = Cpu{
16191559 .name = "attiny43u",
16201560 .llvm_name = "attiny43u",
1621 .features = featureSet(&[_]Feature{
1561 .features = featureSet(&all_features, &[_]Feature{
16221562 .avr25,
16231563 }),
16241564 };
16251565 pub const attiny44 = Cpu{
16261566 .name = "attiny44",
16271567 .llvm_name = "attiny44",
1628 .features = featureSet(&[_]Feature{
1568 .features = featureSet(&all_features, &[_]Feature{
16291569 .avr25,
16301570 }),
16311571 };
16321572 pub const attiny44a = Cpu{
16331573 .name = "attiny44a",
16341574 .llvm_name = "attiny44a",
1635 .features = featureSet(&[_]Feature{
1575 .features = featureSet(&all_features, &[_]Feature{
16361576 .avr25,
16371577 }),
16381578 };
16391579 pub const attiny45 = Cpu{
16401580 .name = "attiny45",
16411581 .llvm_name = "attiny45",
1642 .features = featureSet(&[_]Feature{
1582 .features = featureSet(&all_features, &[_]Feature{
16431583 .avr25,
16441584 }),
16451585 };
16461586 pub const attiny461 = Cpu{
16471587 .name = "attiny461",
16481588 .llvm_name = "attiny461",
1649 .features = featureSet(&[_]Feature{
1589 .features = featureSet(&all_features, &[_]Feature{
16501590 .avr25,
16511591 }),
16521592 };
16531593 pub const attiny461a = Cpu{
16541594 .name = "attiny461a",
16551595 .llvm_name = "attiny461a",
1656 .features = featureSet(&[_]Feature{
1596 .features = featureSet(&all_features, &[_]Feature{
16571597 .avr25,
16581598 }),
16591599 };
16601600 pub const attiny48 = Cpu{
16611601 .name = "attiny48",
16621602 .llvm_name = "attiny48",
1663 .features = featureSet(&[_]Feature{
1603 .features = featureSet(&all_features, &[_]Feature{
16641604 .avr25,
16651605 }),
16661606 };
16671607 pub const attiny5 = Cpu{
16681608 .name = "attiny5",
16691609 .llvm_name = "attiny5",
1670 .features = featureSet(&[_]Feature{
1610 .features = featureSet(&all_features, &[_]Feature{
16711611 .avrtiny,
16721612 }),
16731613 };
16741614 pub const attiny828 = Cpu{
16751615 .name = "attiny828",
16761616 .llvm_name = "attiny828",
1677 .features = featureSet(&[_]Feature{
1617 .features = featureSet(&all_features, &[_]Feature{
16781618 .avr25,
16791619 }),
16801620 };
16811621 pub const attiny84 = Cpu{
16821622 .name = "attiny84",
16831623 .llvm_name = "attiny84",
1684 .features = featureSet(&[_]Feature{
1624 .features = featureSet(&all_features, &[_]Feature{
16851625 .avr25,
16861626 }),
16871627 };
16881628 pub const attiny84a = Cpu{
16891629 .name = "attiny84a",
16901630 .llvm_name = "attiny84a",
1691 .features = featureSet(&[_]Feature{
1631 .features = featureSet(&all_features, &[_]Feature{
16921632 .avr25,
16931633 }),
16941634 };
16951635 pub const attiny85 = Cpu{
16961636 .name = "attiny85",
16971637 .llvm_name = "attiny85",
1698 .features = featureSet(&[_]Feature{
1638 .features = featureSet(&all_features, &[_]Feature{
16991639 .avr25,
17001640 }),
17011641 };
17021642 pub const attiny861 = Cpu{
17031643 .name = "attiny861",
17041644 .llvm_name = "attiny861",
1705 .features = featureSet(&[_]Feature{
1645 .features = featureSet(&all_features, &[_]Feature{
17061646 .avr25,
17071647 }),
17081648 };
17091649 pub const attiny861a = Cpu{
17101650 .name = "attiny861a",
17111651 .llvm_name = "attiny861a",
1712 .features = featureSet(&[_]Feature{
1652 .features = featureSet(&all_features, &[_]Feature{
17131653 .avr25,
17141654 }),
17151655 };
17161656 pub const attiny87 = Cpu{
17171657 .name = "attiny87",
17181658 .llvm_name = "attiny87",
1719 .features = featureSet(&[_]Feature{
1659 .features = featureSet(&all_features, &[_]Feature{
17201660 .avr25,
17211661 }),
17221662 };
17231663 pub const attiny88 = Cpu{
17241664 .name = "attiny88",
17251665 .llvm_name = "attiny88",
1726 .features = featureSet(&[_]Feature{
1666 .features = featureSet(&all_features, &[_]Feature{
17271667 .avr25,
17281668 }),
17291669 };
17301670 pub const attiny9 = Cpu{
17311671 .name = "attiny9",
17321672 .llvm_name = "attiny9",
1733 .features = featureSet(&[_]Feature{
1673 .features = featureSet(&all_features, &[_]Feature{
17341674 .avrtiny,
17351675 }),
17361676 };
17371677 pub const atxmega128a1 = Cpu{
17381678 .name = "atxmega128a1",
17391679 .llvm_name = "atxmega128a1",
1740 .features = featureSet(&[_]Feature{
1680 .features = featureSet(&all_features, &[_]Feature{
17411681 .xmega,
17421682 }),
17431683 };
17441684 pub const atxmega128a1u = Cpu{
17451685 .name = "atxmega128a1u",
17461686 .llvm_name = "atxmega128a1u",
1747 .features = featureSet(&[_]Feature{
1687 .features = featureSet(&all_features, &[_]Feature{
17481688 .xmegau,
17491689 }),
17501690 };
17511691 pub const atxmega128a3 = Cpu{
17521692 .name = "atxmega128a3",
17531693 .llvm_name = "atxmega128a3",
1754 .features = featureSet(&[_]Feature{
1694 .features = featureSet(&all_features, &[_]Feature{
17551695 .xmega,
17561696 }),
17571697 };
17581698 pub const atxmega128a3u = Cpu{
17591699 .name = "atxmega128a3u",
17601700 .llvm_name = "atxmega128a3u",
1761 .features = featureSet(&[_]Feature{
1701 .features = featureSet(&all_features, &[_]Feature{
17621702 .xmegau,
17631703 }),
17641704 };
17651705 pub const atxmega128a4u = Cpu{
17661706 .name = "atxmega128a4u",
17671707 .llvm_name = "atxmega128a4u",
1768 .features = featureSet(&[_]Feature{
1708 .features = featureSet(&all_features, &[_]Feature{
17691709 .xmegau,
17701710 }),
17711711 };
17721712 pub const atxmega128b1 = Cpu{
17731713 .name = "atxmega128b1",
17741714 .llvm_name = "atxmega128b1",
1775 .features = featureSet(&[_]Feature{
1715 .features = featureSet(&all_features, &[_]Feature{
17761716 .xmegau,
17771717 }),
17781718 };
17791719 pub const atxmega128b3 = Cpu{
17801720 .name = "atxmega128b3",
17811721 .llvm_name = "atxmega128b3",
1782 .features = featureSet(&[_]Feature{
1722 .features = featureSet(&all_features, &[_]Feature{
17831723 .xmegau,
17841724 }),
17851725 };
17861726 pub const atxmega128c3 = Cpu{
17871727 .name = "atxmega128c3",
17881728 .llvm_name = "atxmega128c3",
1789 .features = featureSet(&[_]Feature{
1729 .features = featureSet(&all_features, &[_]Feature{
17901730 .xmegau,
17911731 }),
17921732 };
17931733 pub const atxmega128d3 = Cpu{
17941734 .name = "atxmega128d3",
17951735 .llvm_name = "atxmega128d3",
1796 .features = featureSet(&[_]Feature{
1736 .features = featureSet(&all_features, &[_]Feature{
17971737 .xmega,
17981738 }),
17991739 };
18001740 pub const atxmega128d4 = Cpu{
18011741 .name = "atxmega128d4",
18021742 .llvm_name = "atxmega128d4",
1803 .features = featureSet(&[_]Feature{
1743 .features = featureSet(&all_features, &[_]Feature{
18041744 .xmega,
18051745 }),
18061746 };
18071747 pub const atxmega16a4 = Cpu{
18081748 .name = "atxmega16a4",
18091749 .llvm_name = "atxmega16a4",
1810 .features = featureSet(&[_]Feature{
1750 .features = featureSet(&all_features, &[_]Feature{
18111751 .xmega,
18121752 }),
18131753 };
18141754 pub const atxmega16a4u = Cpu{
18151755 .name = "atxmega16a4u",
18161756 .llvm_name = "atxmega16a4u",
1817 .features = featureSet(&[_]Feature{
1757 .features = featureSet(&all_features, &[_]Feature{
18181758 .xmegau,
18191759 }),
18201760 };
18211761 pub const atxmega16c4 = Cpu{
18221762 .name = "atxmega16c4",
18231763 .llvm_name = "atxmega16c4",
1824 .features = featureSet(&[_]Feature{
1764 .features = featureSet(&all_features, &[_]Feature{
18251765 .xmegau,
18261766 }),
18271767 };
18281768 pub const atxmega16d4 = Cpu{
18291769 .name = "atxmega16d4",
18301770 .llvm_name = "atxmega16d4",
1831 .features = featureSet(&[_]Feature{
1771 .features = featureSet(&all_features, &[_]Feature{
18321772 .xmega,
18331773 }),
18341774 };
18351775 pub const atxmega16e5 = Cpu{
18361776 .name = "atxmega16e5",
18371777 .llvm_name = "atxmega16e5",
1838 .features = featureSet(&[_]Feature{
1778 .features = featureSet(&all_features, &[_]Feature{
18391779 .xmega,
18401780 }),
18411781 };
18421782 pub const atxmega192a3 = Cpu{
18431783 .name = "atxmega192a3",
18441784 .llvm_name = "atxmega192a3",
1845 .features = featureSet(&[_]Feature{
1785 .features = featureSet(&all_features, &[_]Feature{
18461786 .xmega,
18471787 }),
18481788 };
18491789 pub const atxmega192a3u = Cpu{
18501790 .name = "atxmega192a3u",
18511791 .llvm_name = "atxmega192a3u",
1852 .features = featureSet(&[_]Feature{
1792 .features = featureSet(&all_features, &[_]Feature{
18531793 .xmegau,
18541794 }),
18551795 };
18561796 pub const atxmega192c3 = Cpu{
18571797 .name = "atxmega192c3",
18581798 .llvm_name = "atxmega192c3",
1859 .features = featureSet(&[_]Feature{
1799 .features = featureSet(&all_features, &[_]Feature{
18601800 .xmegau,
18611801 }),
18621802 };
18631803 pub const atxmega192d3 = Cpu{
18641804 .name = "atxmega192d3",
18651805 .llvm_name = "atxmega192d3",
1866 .features = featureSet(&[_]Feature{
1806 .features = featureSet(&all_features, &[_]Feature{
18671807 .xmega,
18681808 }),
18691809 };
18701810 pub const atxmega256a3 = Cpu{
18711811 .name = "atxmega256a3",
18721812 .llvm_name = "atxmega256a3",
1873 .features = featureSet(&[_]Feature{
1813 .features = featureSet(&all_features, &[_]Feature{
18741814 .xmega,
18751815 }),
18761816 };
18771817 pub const atxmega256a3b = Cpu{
18781818 .name = "atxmega256a3b",
18791819 .llvm_name = "atxmega256a3b",
1880 .features = featureSet(&[_]Feature{
1820 .features = featureSet(&all_features, &[_]Feature{
18811821 .xmega,
18821822 }),
18831823 };
18841824 pub const atxmega256a3bu = Cpu{
18851825 .name = "atxmega256a3bu",
18861826 .llvm_name = "atxmega256a3bu",
1887 .features = featureSet(&[_]Feature{
1827 .features = featureSet(&all_features, &[_]Feature{
18881828 .xmegau,
18891829 }),
18901830 };
18911831 pub const atxmega256a3u = Cpu{
18921832 .name = "atxmega256a3u",
18931833 .llvm_name = "atxmega256a3u",
1894 .features = featureSet(&[_]Feature{
1834 .features = featureSet(&all_features, &[_]Feature{
18951835 .xmegau,
18961836 }),
18971837 };
18981838 pub const atxmega256c3 = Cpu{
18991839 .name = "atxmega256c3",
19001840 .llvm_name = "atxmega256c3",
1901 .features = featureSet(&[_]Feature{
1841 .features = featureSet(&all_features, &[_]Feature{
19021842 .xmegau,
19031843 }),
19041844 };
19051845 pub const atxmega256d3 = Cpu{
19061846 .name = "atxmega256d3",
19071847 .llvm_name = "atxmega256d3",
1908 .features = featureSet(&[_]Feature{
1848 .features = featureSet(&all_features, &[_]Feature{
19091849 .xmega,
19101850 }),
19111851 };
19121852 pub const atxmega32a4 = Cpu{
19131853 .name = "atxmega32a4",
19141854 .llvm_name = "atxmega32a4",
1915 .features = featureSet(&[_]Feature{
1855 .features = featureSet(&all_features, &[_]Feature{
19161856 .xmega,
19171857 }),
19181858 };
19191859 pub const atxmega32a4u = Cpu{
19201860 .name = "atxmega32a4u",
19211861 .llvm_name = "atxmega32a4u",
1922 .features = featureSet(&[_]Feature{
1862 .features = featureSet(&all_features, &[_]Feature{
19231863 .xmegau,
19241864 }),
19251865 };
19261866 pub const atxmega32c4 = Cpu{
19271867 .name = "atxmega32c4",
19281868 .llvm_name = "atxmega32c4",
1929 .features = featureSet(&[_]Feature{
1869 .features = featureSet(&all_features, &[_]Feature{
19301870 .xmegau,
19311871 }),
19321872 };
19331873 pub const atxmega32d4 = Cpu{
19341874 .name = "atxmega32d4",
19351875 .llvm_name = "atxmega32d4",
1936 .features = featureSet(&[_]Feature{
1876 .features = featureSet(&all_features, &[_]Feature{
19371877 .xmega,
19381878 }),
19391879 };
19401880 pub const atxmega32e5 = Cpu{
19411881 .name = "atxmega32e5",
19421882 .llvm_name = "atxmega32e5",
1943 .features = featureSet(&[_]Feature{
1883 .features = featureSet(&all_features, &[_]Feature{
19441884 .xmega,
19451885 }),
19461886 };
19471887 pub const atxmega32x1 = Cpu{
19481888 .name = "atxmega32x1",
19491889 .llvm_name = "atxmega32x1",
1950 .features = featureSet(&[_]Feature{
1890 .features = featureSet(&all_features, &[_]Feature{
19511891 .xmega,
19521892 }),
19531893 };
19541894 pub const atxmega384c3 = Cpu{
19551895 .name = "atxmega384c3",
19561896 .llvm_name = "atxmega384c3",
1957 .features = featureSet(&[_]Feature{
1897 .features = featureSet(&all_features, &[_]Feature{
19581898 .xmegau,
19591899 }),
19601900 };
19611901 pub const atxmega384d3 = Cpu{
19621902 .name = "atxmega384d3",
19631903 .llvm_name = "atxmega384d3",
1964 .features = featureSet(&[_]Feature{
1904 .features = featureSet(&all_features, &[_]Feature{
19651905 .xmega,
19661906 }),
19671907 };
19681908 pub const atxmega64a1 = Cpu{
19691909 .name = "atxmega64a1",
19701910 .llvm_name = "atxmega64a1",
1971 .features = featureSet(&[_]Feature{
1911 .features = featureSet(&all_features, &[_]Feature{
19721912 .xmega,
19731913 }),
19741914 };
19751915 pub const atxmega64a1u = Cpu{
19761916 .name = "atxmega64a1u",
19771917 .llvm_name = "atxmega64a1u",
1978 .features = featureSet(&[_]Feature{
1918 .features = featureSet(&all_features, &[_]Feature{
19791919 .xmegau,
19801920 }),
19811921 };
19821922 pub const atxmega64a3 = Cpu{
19831923 .name = "atxmega64a3",
19841924 .llvm_name = "atxmega64a3",
1985 .features = featureSet(&[_]Feature{
1925 .features = featureSet(&all_features, &[_]Feature{
19861926 .xmega,
19871927 }),
19881928 };
19891929 pub const atxmega64a3u = Cpu{
19901930 .name = "atxmega64a3u",
19911931 .llvm_name = "atxmega64a3u",
1992 .features = featureSet(&[_]Feature{
1932 .features = featureSet(&all_features, &[_]Feature{
19931933 .xmegau,
19941934 }),
19951935 };
19961936 pub const atxmega64a4u = Cpu{
19971937 .name = "atxmega64a4u",
19981938 .llvm_name = "atxmega64a4u",
1999 .features = featureSet(&[_]Feature{
1939 .features = featureSet(&all_features, &[_]Feature{
20001940 .xmegau,
20011941 }),
20021942 };
20031943 pub const atxmega64b1 = Cpu{
20041944 .name = "atxmega64b1",
20051945 .llvm_name = "atxmega64b1",
2006 .features = featureSet(&[_]Feature{
1946 .features = featureSet(&all_features, &[_]Feature{
20071947 .xmegau,
20081948 }),
20091949 };
20101950 pub const atxmega64b3 = Cpu{
20111951 .name = "atxmega64b3",
20121952 .llvm_name = "atxmega64b3",
2013 .features = featureSet(&[_]Feature{
1953 .features = featureSet(&all_features, &[_]Feature{
20141954 .xmegau,
20151955 }),
20161956 };
20171957 pub const atxmega64c3 = Cpu{
20181958 .name = "atxmega64c3",
20191959 .llvm_name = "atxmega64c3",
2020 .features = featureSet(&[_]Feature{
1960 .features = featureSet(&all_features, &[_]Feature{
20211961 .xmegau,
20221962 }),
20231963 };
20241964 pub const atxmega64d3 = Cpu{
20251965 .name = "atxmega64d3",
20261966 .llvm_name = "atxmega64d3",
2027 .features = featureSet(&[_]Feature{
1967 .features = featureSet(&all_features, &[_]Feature{
20281968 .xmega,
20291969 }),
20301970 };
20311971 pub const atxmega64d4 = Cpu{
20321972 .name = "atxmega64d4",
20331973 .llvm_name = "atxmega64d4",
2034 .features = featureSet(&[_]Feature{
1974 .features = featureSet(&all_features, &[_]Feature{
20351975 .xmega,
20361976 }),
20371977 };
20381978 pub const atxmega8e5 = Cpu{
20391979 .name = "atxmega8e5",
20401980 .llvm_name = "atxmega8e5",
2041 .features = featureSet(&[_]Feature{
1981 .features = featureSet(&all_features, &[_]Feature{
20421982 .xmega,
20431983 }),
20441984 };
20451985 pub const avr1 = Cpu{
20461986 .name = "avr1",
20471987 .llvm_name = "avr1",
2048 .features = featureSet(&[_]Feature{
1988 .features = featureSet(&all_features, &[_]Feature{
20491989 .avr1,
20501990 }),
20511991 };
20521992 pub const avr2 = Cpu{
20531993 .name = "avr2",
20541994 .llvm_name = "avr2",
2055 .features = featureSet(&[_]Feature{
1995 .features = featureSet(&all_features, &[_]Feature{
20561996 .avr2,
20571997 }),
20581998 };
20591999 pub const avr25 = Cpu{
20602000 .name = "avr25",
20612001 .llvm_name = "avr25",
2062 .features = featureSet(&[_]Feature{
2002 .features = featureSet(&all_features, &[_]Feature{
20632003 .avr25,
20642004 }),
20652005 };
20662006 pub const avr3 = Cpu{
20672007 .name = "avr3",
20682008 .llvm_name = "avr3",
2069 .features = featureSet(&[_]Feature{
2009 .features = featureSet(&all_features, &[_]Feature{
20702010 .avr3,
20712011 }),
20722012 };
20732013 pub const avr31 = Cpu{
20742014 .name = "avr31",
20752015 .llvm_name = "avr31",
2076 .features = featureSet(&[_]Feature{
2016 .features = featureSet(&all_features, &[_]Feature{
20772017 .avr31,
20782018 }),
20792019 };
20802020 pub const avr35 = Cpu{
20812021 .name = "avr35",
20822022 .llvm_name = "avr35",
2083 .features = featureSet(&[_]Feature{
2023 .features = featureSet(&all_features, &[_]Feature{
20842024 .avr35,
20852025 }),
20862026 };
20872027 pub const avr4 = Cpu{
20882028 .name = "avr4",
20892029 .llvm_name = "avr4",
2090 .features = featureSet(&[_]Feature{
2030 .features = featureSet(&all_features, &[_]Feature{
20912031 .avr4,
20922032 }),
20932033 };
20942034 pub const avr5 = Cpu{
20952035 .name = "avr5",
20962036 .llvm_name = "avr5",
2097 .features = featureSet(&[_]Feature{
2037 .features = featureSet(&all_features, &[_]Feature{
20982038 .avr5,
20992039 }),
21002040 };
21012041 pub const avr51 = Cpu{
21022042 .name = "avr51",
21032043 .llvm_name = "avr51",
2104 .features = featureSet(&[_]Feature{
2044 .features = featureSet(&all_features, &[_]Feature{
21052045 .avr51,
21062046 }),
21072047 };
21082048 pub const avr6 = Cpu{
21092049 .name = "avr6",
21102050 .llvm_name = "avr6",
2111 .features = featureSet(&[_]Feature{
2051 .features = featureSet(&all_features, &[_]Feature{
21122052 .avr6,
21132053 }),
21142054 };
21152055 pub const avrtiny = Cpu{
21162056 .name = "avrtiny",
21172057 .llvm_name = "avrtiny",
2118 .features = featureSet(&[_]Feature{
2058 .features = featureSet(&all_features, &[_]Feature{
21192059 .avrtiny,
21202060 }),
21212061 };
21222062 pub const avrxmega1 = Cpu{
21232063 .name = "avrxmega1",
21242064 .llvm_name = "avrxmega1",
2125 .features = featureSet(&[_]Feature{
2065 .features = featureSet(&all_features, &[_]Feature{
21262066 .xmega,
21272067 }),
21282068 };
21292069 pub const avrxmega2 = Cpu{
21302070 .name = "avrxmega2",
21312071 .llvm_name = "avrxmega2",
2132 .features = featureSet(&[_]Feature{
2072 .features = featureSet(&all_features, &[_]Feature{
21332073 .xmega,
21342074 }),
21352075 };
21362076 pub const avrxmega3 = Cpu{
21372077 .name = "avrxmega3",
21382078 .llvm_name = "avrxmega3",
2139 .features = featureSet(&[_]Feature{
2079 .features = featureSet(&all_features, &[_]Feature{
21402080 .xmega,
21412081 }),
21422082 };
21432083 pub const avrxmega4 = Cpu{
21442084 .name = "avrxmega4",
21452085 .llvm_name = "avrxmega4",
2146 .features = featureSet(&[_]Feature{
2086 .features = featureSet(&all_features, &[_]Feature{
21472087 .xmega,
21482088 }),
21492089 };
21502090 pub const avrxmega5 = Cpu{
21512091 .name = "avrxmega5",
21522092 .llvm_name = "avrxmega5",
2153 .features = featureSet(&[_]Feature{
2093 .features = featureSet(&all_features, &[_]Feature{
21542094 .xmega,
21552095 }),
21562096 };
21572097 pub const avrxmega6 = Cpu{
21582098 .name = "avrxmega6",
21592099 .llvm_name = "avrxmega6",
2160 .features = featureSet(&[_]Feature{
2100 .features = featureSet(&all_features, &[_]Feature{
21612101 .xmega,
21622102 }),
21632103 };
21642104 pub const avrxmega7 = Cpu{
21652105 .name = "avrxmega7",
21662106 .llvm_name = "avrxmega7",
2167 .features = featureSet(&[_]Feature{
2107 .features = featureSet(&all_features, &[_]Feature{
21682108 .xmega,
21692109 }),
21702110 };
21712111 pub const m3000 = Cpu{
21722112 .name = "m3000",
21732113 .llvm_name = "m3000",
2174 .features = featureSet(&[_]Feature{
2114 .features = featureSet(&all_features, &[_]Feature{
21752115 .avr5,
21762116 }),
21772117 };
......@@ -2440,6 +2380,6 @@ pub const all_cpus = &[_]*const Cpu{
24402380 &cpu.m3000,
24412381};
24422382
2443pub const baseline_features = featureSet(&[_]Feature{
2383pub const baseline_features = featureSet(&all_features, &[_]Feature{
24442384 .avr0,
24452385});
lib/std/target/bpf.zig+15-15
......@@ -11,29 +11,29 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
1111
1212pub const all_features = blk: {
1313 const len = @typeInfo(Feature).Enum.fields.len;
14 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
14 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
1515 var result: [len]Cpu.Feature = undefined;
1616 result[@enumToInt(Feature.alu32)] = .{
17 .index = @enumToInt(Feature.alu32),
18 .name = @tagName(Feature.alu32),
1917 .llvm_name = "alu32",
2018 .description = "Enable ALU32 instructions",
21 .dependencies = featureSet(&[_]Feature{}),
19 .dependencies = sparseFeatureSet(&[_]Feature{}),
2220 };
2321 result[@enumToInt(Feature.dummy)] = .{
24 .index = @enumToInt(Feature.dummy),
25 .name = @tagName(Feature.dummy),
2622 .llvm_name = "dummy",
2723 .description = "unused feature",
28 .dependencies = featureSet(&[_]Feature{}),
24 .dependencies = sparseFeatureSet(&[_]Feature{}),
2925 };
3026 result[@enumToInt(Feature.dwarfris)] = .{
31 .index = @enumToInt(Feature.dwarfris),
32 .name = @tagName(Feature.dwarfris),
3327 .llvm_name = "dwarfris",
3428 .description = "Disable MCAsmInfo DwarfUsesRelocationsAcrossSections",
35 .dependencies = featureSet(&[_]Feature{}),
29 .dependencies = sparseFeatureSet(&[_]Feature{}),
3630 };
31 const ti = @typeInfo(Feature);
32 for (result) |*elem, i| {
33 elem.index = i;
34 elem.name = ti.Enum.fields[i].name;
35 elem.dependencies.initAsDependencies(i, &result);
36 }
3737 break :blk result;
3838};
3939
......@@ -41,27 +41,27 @@ pub const cpu = struct {
4141 pub const generic = Cpu{
4242 .name = "generic",
4343 .llvm_name = "generic",
44 .features = featureSet(&[_]Feature{}),
44 .features = featureSet(&all_features, &[_]Feature{}),
4545 };
4646 pub const probe = Cpu{
4747 .name = "probe",
4848 .llvm_name = "probe",
49 .features = featureSet(&[_]Feature{}),
49 .features = featureSet(&all_features, &[_]Feature{}),
5050 };
5151 pub const v1 = Cpu{
5252 .name = "v1",
5353 .llvm_name = "v1",
54 .features = featureSet(&[_]Feature{}),
54 .features = featureSet(&all_features, &[_]Feature{}),
5555 };
5656 pub const v2 = Cpu{
5757 .name = "v2",
5858 .llvm_name = "v2",
59 .features = featureSet(&[_]Feature{}),
59 .features = featureSet(&all_features, &[_]Feature{}),
6060 };
6161 pub const v3 = Cpu{
6262 .name = "v3",
6363 .llvm_name = "v3",
64 .features = featureSet(&[_]Feature{}),
64 .features = featureSet(&all_features, &[_]Feature{}),
6565 };
6666};
6767
lib/std/target/hexagon.zig+38-80
......@@ -32,76 +32,60 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
3232
3333pub const all_features = blk: {
3434 const len = @typeInfo(Feature).Enum.fields.len;
35 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
35 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
3636 var result: [len]Cpu.Feature = undefined;
3737 result[@enumToInt(Feature.duplex)] = .{
38 .index = @enumToInt(Feature.duplex),
39 .name = @tagName(Feature.duplex),
4038 .llvm_name = "duplex",
4139 .description = "Enable generation of duplex instruction",
42 .dependencies = featureSet(&[_]Feature{}),
40 .dependencies = sparseFeatureSet(&[_]Feature{}),
4341 };
4442 result[@enumToInt(Feature.hvx)] = .{
45 .index = @enumToInt(Feature.hvx),
46 .name = @tagName(Feature.hvx),
4743 .llvm_name = "hvx",
4844 .description = "Hexagon HVX instructions",
49 .dependencies = featureSet(&[_]Feature{}),
45 .dependencies = sparseFeatureSet(&[_]Feature{}),
5046 };
5147 result[@enumToInt(Feature.hvx_length128b)] = .{
52 .index = @enumToInt(Feature.hvx_length128b),
53 .name = @tagName(Feature.hvx_length128b),
5448 .llvm_name = "hvx-length128b",
5549 .description = "Hexagon HVX 128B instructions",
56 .dependencies = featureSet(&[_]Feature{
50 .dependencies = sparseFeatureSet(&[_]Feature{
5751 .hvx,
5852 }),
5953 };
6054 result[@enumToInt(Feature.hvx_length64b)] = .{
61 .index = @enumToInt(Feature.hvx_length64b),
62 .name = @tagName(Feature.hvx_length64b),
6355 .llvm_name = "hvx-length64b",
6456 .description = "Hexagon HVX 64B instructions",
65 .dependencies = featureSet(&[_]Feature{
57 .dependencies = sparseFeatureSet(&[_]Feature{
6658 .hvx,
6759 }),
6860 };
6961 result[@enumToInt(Feature.hvxv60)] = .{
70 .index = @enumToInt(Feature.hvxv60),
71 .name = @tagName(Feature.hvxv60),
7262 .llvm_name = "hvxv60",
7363 .description = "Hexagon HVX instructions",
74 .dependencies = featureSet(&[_]Feature{
64 .dependencies = sparseFeatureSet(&[_]Feature{
7565 .hvx,
7666 }),
7767 };
7868 result[@enumToInt(Feature.hvxv62)] = .{
79 .index = @enumToInt(Feature.hvxv62),
80 .name = @tagName(Feature.hvxv62),
8169 .llvm_name = "hvxv62",
8270 .description = "Hexagon HVX instructions",
83 .dependencies = featureSet(&[_]Feature{
71 .dependencies = sparseFeatureSet(&[_]Feature{
8472 .hvx,
8573 .hvxv60,
8674 }),
8775 };
8876 result[@enumToInt(Feature.hvxv65)] = .{
89 .index = @enumToInt(Feature.hvxv65),
90 .name = @tagName(Feature.hvxv65),
9177 .llvm_name = "hvxv65",
9278 .description = "Hexagon HVX instructions",
93 .dependencies = featureSet(&[_]Feature{
79 .dependencies = sparseFeatureSet(&[_]Feature{
9480 .hvx,
9581 .hvxv60,
9682 .hvxv62,
9783 }),
9884 };
9985 result[@enumToInt(Feature.hvxv66)] = .{
100 .index = @enumToInt(Feature.hvxv66),
101 .name = @tagName(Feature.hvxv66),
10286 .llvm_name = "hvxv66",
10387 .description = "Hexagon HVX instructions",
104 .dependencies = featureSet(&[_]Feature{
88 .dependencies = sparseFeatureSet(&[_]Feature{
10589 .hvx,
10690 .hvxv60,
10791 .hvxv62,
......@@ -110,121 +94,95 @@ pub const all_features = blk: {
11094 }),
11195 };
11296 result[@enumToInt(Feature.long_calls)] = .{
113 .index = @enumToInt(Feature.long_calls),
114 .name = @tagName(Feature.long_calls),
11597 .llvm_name = "long-calls",
11698 .description = "Use constant-extended calls",
117 .dependencies = featureSet(&[_]Feature{}),
99 .dependencies = sparseFeatureSet(&[_]Feature{}),
118100 };
119101 result[@enumToInt(Feature.mem_noshuf)] = .{
120 .index = @enumToInt(Feature.mem_noshuf),
121 .name = @tagName(Feature.mem_noshuf),
122102 .llvm_name = "mem_noshuf",
123103 .description = "Supports mem_noshuf feature",
124 .dependencies = featureSet(&[_]Feature{}),
104 .dependencies = sparseFeatureSet(&[_]Feature{}),
125105 };
126106 result[@enumToInt(Feature.memops)] = .{
127 .index = @enumToInt(Feature.memops),
128 .name = @tagName(Feature.memops),
129107 .llvm_name = "memops",
130108 .description = "Use memop instructions",
131 .dependencies = featureSet(&[_]Feature{}),
109 .dependencies = sparseFeatureSet(&[_]Feature{}),
132110 };
133111 result[@enumToInt(Feature.noreturn_stack_elim)] = .{
134 .index = @enumToInt(Feature.noreturn_stack_elim),
135 .name = @tagName(Feature.noreturn_stack_elim),
136112 .llvm_name = "noreturn-stack-elim",
137113 .description = "Eliminate stack allocation in a noreturn function when possible",
138 .dependencies = featureSet(&[_]Feature{}),
114 .dependencies = sparseFeatureSet(&[_]Feature{}),
139115 };
140116 result[@enumToInt(Feature.nvj)] = .{
141 .index = @enumToInt(Feature.nvj),
142 .name = @tagName(Feature.nvj),
143117 .llvm_name = "nvj",
144118 .description = "Support for new-value jumps",
145 .dependencies = featureSet(&[_]Feature{
119 .dependencies = sparseFeatureSet(&[_]Feature{
146120 .packets,
147121 }),
148122 };
149123 result[@enumToInt(Feature.nvs)] = .{
150 .index = @enumToInt(Feature.nvs),
151 .name = @tagName(Feature.nvs),
152124 .llvm_name = "nvs",
153125 .description = "Support for new-value stores",
154 .dependencies = featureSet(&[_]Feature{
126 .dependencies = sparseFeatureSet(&[_]Feature{
155127 .packets,
156128 }),
157129 };
158130 result[@enumToInt(Feature.packets)] = .{
159 .index = @enumToInt(Feature.packets),
160 .name = @tagName(Feature.packets),
161131 .llvm_name = "packets",
162132 .description = "Support for instruction packets",
163 .dependencies = featureSet(&[_]Feature{}),
133 .dependencies = sparseFeatureSet(&[_]Feature{}),
164134 };
165135 result[@enumToInt(Feature.reserved_r19)] = .{
166 .index = @enumToInt(Feature.reserved_r19),
167 .name = @tagName(Feature.reserved_r19),
168136 .llvm_name = "reserved-r19",
169137 .description = "Reserve register R19",
170 .dependencies = featureSet(&[_]Feature{}),
138 .dependencies = sparseFeatureSet(&[_]Feature{}),
171139 };
172140 result[@enumToInt(Feature.small_data)] = .{
173 .index = @enumToInt(Feature.small_data),
174 .name = @tagName(Feature.small_data),
175141 .llvm_name = "small-data",
176142 .description = "Allow GP-relative addressing of global variables",
177 .dependencies = featureSet(&[_]Feature{}),
143 .dependencies = sparseFeatureSet(&[_]Feature{}),
178144 };
179145 result[@enumToInt(Feature.v5)] = .{
180 .index = @enumToInt(Feature.v5),
181 .name = @tagName(Feature.v5),
182146 .llvm_name = "v5",
183147 .description = "Enable Hexagon V5 architecture",
184 .dependencies = featureSet(&[_]Feature{}),
148 .dependencies = sparseFeatureSet(&[_]Feature{}),
185149 };
186150 result[@enumToInt(Feature.v55)] = .{
187 .index = @enumToInt(Feature.v55),
188 .name = @tagName(Feature.v55),
189151 .llvm_name = "v55",
190152 .description = "Enable Hexagon V55 architecture",
191 .dependencies = featureSet(&[_]Feature{}),
153 .dependencies = sparseFeatureSet(&[_]Feature{}),
192154 };
193155 result[@enumToInt(Feature.v60)] = .{
194 .index = @enumToInt(Feature.v60),
195 .name = @tagName(Feature.v60),
196156 .llvm_name = "v60",
197157 .description = "Enable Hexagon V60 architecture",
198 .dependencies = featureSet(&[_]Feature{}),
158 .dependencies = sparseFeatureSet(&[_]Feature{}),
199159 };
200160 result[@enumToInt(Feature.v62)] = .{
201 .index = @enumToInt(Feature.v62),
202 .name = @tagName(Feature.v62),
203161 .llvm_name = "v62",
204162 .description = "Enable Hexagon V62 architecture",
205 .dependencies = featureSet(&[_]Feature{}),
163 .dependencies = sparseFeatureSet(&[_]Feature{}),
206164 };
207165 result[@enumToInt(Feature.v65)] = .{
208 .index = @enumToInt(Feature.v65),
209 .name = @tagName(Feature.v65),
210166 .llvm_name = "v65",
211167 .description = "Enable Hexagon V65 architecture",
212 .dependencies = featureSet(&[_]Feature{}),
168 .dependencies = sparseFeatureSet(&[_]Feature{}),
213169 };
214170 result[@enumToInt(Feature.v66)] = .{
215 .index = @enumToInt(Feature.v66),
216 .name = @tagName(Feature.v66),
217171 .llvm_name = "v66",
218172 .description = "Enable Hexagon V66 architecture",
219 .dependencies = featureSet(&[_]Feature{}),
173 .dependencies = sparseFeatureSet(&[_]Feature{}),
220174 };
221175 result[@enumToInt(Feature.zreg)] = .{
222 .index = @enumToInt(Feature.zreg),
223 .name = @tagName(Feature.zreg),
224176 .llvm_name = "zreg",
225177 .description = "Hexagon ZReg extension instructions",
226 .dependencies = featureSet(&[_]Feature{}),
178 .dependencies = sparseFeatureSet(&[_]Feature{}),
227179 };
180 const ti = @typeInfo(Feature);
181 for (result) |*elem, i| {
182 elem.index = i;
183 elem.name = ti.Enum.fields[i].name;
184 elem.dependencies.initAsDependencies(i, &result);
185 }
228186 break :blk result;
229187};
230188
......@@ -232,7 +190,7 @@ pub const cpu = struct {
232190 pub const generic = Cpu{
233191 .name = "generic",
234192 .llvm_name = "generic",
235 .features = featureSet(&[_]Feature{
193 .features = featureSet(&all_features, &[_]Feature{
236194 .duplex,
237195 .memops,
238196 .nvj,
......@@ -247,7 +205,7 @@ pub const cpu = struct {
247205 pub const hexagonv5 = Cpu{
248206 .name = "hexagonv5",
249207 .llvm_name = "hexagonv5",
250 .features = featureSet(&[_]Feature{
208 .features = featureSet(&all_features, &[_]Feature{
251209 .duplex,
252210 .memops,
253211 .nvj,
......@@ -260,7 +218,7 @@ pub const cpu = struct {
260218 pub const hexagonv55 = Cpu{
261219 .name = "hexagonv55",
262220 .llvm_name = "hexagonv55",
263 .features = featureSet(&[_]Feature{
221 .features = featureSet(&all_features, &[_]Feature{
264222 .duplex,
265223 .memops,
266224 .nvj,
......@@ -274,7 +232,7 @@ pub const cpu = struct {
274232 pub const hexagonv60 = Cpu{
275233 .name = "hexagonv60",
276234 .llvm_name = "hexagonv60",
277 .features = featureSet(&[_]Feature{
235 .features = featureSet(&all_features, &[_]Feature{
278236 .duplex,
279237 .memops,
280238 .nvj,
......@@ -289,7 +247,7 @@ pub const cpu = struct {
289247 pub const hexagonv62 = Cpu{
290248 .name = "hexagonv62",
291249 .llvm_name = "hexagonv62",
292 .features = featureSet(&[_]Feature{
250 .features = featureSet(&all_features, &[_]Feature{
293251 .duplex,
294252 .memops,
295253 .nvj,
......@@ -305,7 +263,7 @@ pub const cpu = struct {
305263 pub const hexagonv65 = Cpu{
306264 .name = "hexagonv65",
307265 .llvm_name = "hexagonv65",
308 .features = featureSet(&[_]Feature{
266 .features = featureSet(&all_features, &[_]Feature{
309267 .duplex,
310268 .mem_noshuf,
311269 .memops,
......@@ -323,7 +281,7 @@ pub const cpu = struct {
323281 pub const hexagonv66 = Cpu{
324282 .name = "hexagonv66",
325283 .llvm_name = "hexagonv66",
326 .features = featureSet(&[_]Feature{
284 .features = featureSet(&all_features, &[_]Feature{
327285 .duplex,
328286 .mem_noshuf,
329287 .memops,
lib/std/target/mips.zig+74-166
......@@ -57,135 +57,101 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
5757
5858pub const all_features = blk: {
5959 const len = @typeInfo(Feature).Enum.fields.len;
60 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
60 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
6161 var result: [len]Cpu.Feature = undefined;
6262 result[@enumToInt(Feature.abs2008)] = .{
63 .index = @enumToInt(Feature.abs2008),
64 .name = @tagName(Feature.abs2008),
6563 .llvm_name = "abs2008",
6664 .description = "Disable IEEE 754-2008 abs.fmt mode",
67 .dependencies = featureSet(&[_]Feature{}),
65 .dependencies = sparseFeatureSet(&[_]Feature{}),
6866 };
6967 result[@enumToInt(Feature.cnmips)] = .{
70 .index = @enumToInt(Feature.cnmips),
71 .name = @tagName(Feature.cnmips),
7268 .llvm_name = "cnmips",
7369 .description = "Octeon cnMIPS Support",
74 .dependencies = featureSet(&[_]Feature{
70 .dependencies = sparseFeatureSet(&[_]Feature{
7571 .mips64r2,
7672 }),
7773 };
7874 result[@enumToInt(Feature.crc)] = .{
79 .index = @enumToInt(Feature.crc),
80 .name = @tagName(Feature.crc),
8175 .llvm_name = "crc",
8276 .description = "Mips R6 CRC ASE",
83 .dependencies = featureSet(&[_]Feature{}),
77 .dependencies = sparseFeatureSet(&[_]Feature{}),
8478 };
8579 result[@enumToInt(Feature.dsp)] = .{
86 .index = @enumToInt(Feature.dsp),
87 .name = @tagName(Feature.dsp),
8880 .llvm_name = "dsp",
8981 .description = "Mips DSP ASE",
90 .dependencies = featureSet(&[_]Feature{}),
82 .dependencies = sparseFeatureSet(&[_]Feature{}),
9183 };
9284 result[@enumToInt(Feature.dspr2)] = .{
93 .index = @enumToInt(Feature.dspr2),
94 .name = @tagName(Feature.dspr2),
9585 .llvm_name = "dspr2",
9686 .description = "Mips DSP-R2 ASE",
97 .dependencies = featureSet(&[_]Feature{
87 .dependencies = sparseFeatureSet(&[_]Feature{
9888 .dsp,
9989 }),
10090 };
10191 result[@enumToInt(Feature.dspr3)] = .{
102 .index = @enumToInt(Feature.dspr3),
103 .name = @tagName(Feature.dspr3),
10492 .llvm_name = "dspr3",
10593 .description = "Mips DSP-R3 ASE",
106 .dependencies = featureSet(&[_]Feature{
94 .dependencies = sparseFeatureSet(&[_]Feature{
10795 .dsp,
10896 .dspr2,
10997 }),
11098 };
11199 result[@enumToInt(Feature.eva)] = .{
112 .index = @enumToInt(Feature.eva),
113 .name = @tagName(Feature.eva),
114100 .llvm_name = "eva",
115101 .description = "Mips EVA ASE",
116 .dependencies = featureSet(&[_]Feature{}),
102 .dependencies = sparseFeatureSet(&[_]Feature{}),
117103 };
118104 result[@enumToInt(Feature.fp64)] = .{
119 .index = @enumToInt(Feature.fp64),
120 .name = @tagName(Feature.fp64),
121105 .llvm_name = "fp64",
122106 .description = "Support 64-bit FP registers",
123 .dependencies = featureSet(&[_]Feature{}),
107 .dependencies = sparseFeatureSet(&[_]Feature{}),
124108 };
125109 result[@enumToInt(Feature.fpxx)] = .{
126 .index = @enumToInt(Feature.fpxx),
127 .name = @tagName(Feature.fpxx),
128110 .llvm_name = "fpxx",
129111 .description = "Support for FPXX",
130 .dependencies = featureSet(&[_]Feature{}),
112 .dependencies = sparseFeatureSet(&[_]Feature{}),
131113 };
132114 result[@enumToInt(Feature.ginv)] = .{
133 .index = @enumToInt(Feature.ginv),
134 .name = @tagName(Feature.ginv),
135115 .llvm_name = "ginv",
136116 .description = "Mips Global Invalidate ASE",
137 .dependencies = featureSet(&[_]Feature{}),
117 .dependencies = sparseFeatureSet(&[_]Feature{}),
138118 };
139119 result[@enumToInt(Feature.gp64)] = .{
140 .index = @enumToInt(Feature.gp64),
141 .name = @tagName(Feature.gp64),
142120 .llvm_name = "gp64",
143121 .description = "General Purpose Registers are 64-bit wide",
144 .dependencies = featureSet(&[_]Feature{}),
122 .dependencies = sparseFeatureSet(&[_]Feature{}),
145123 };
146124 result[@enumToInt(Feature.long_calls)] = .{
147 .index = @enumToInt(Feature.long_calls),
148 .name = @tagName(Feature.long_calls),
149125 .llvm_name = "long-calls",
150126 .description = "Disable use of the jal instruction",
151 .dependencies = featureSet(&[_]Feature{}),
127 .dependencies = sparseFeatureSet(&[_]Feature{}),
152128 };
153129 result[@enumToInt(Feature.micromips)] = .{
154 .index = @enumToInt(Feature.micromips),
155 .name = @tagName(Feature.micromips),
156130 .llvm_name = "micromips",
157131 .description = "microMips mode",
158 .dependencies = featureSet(&[_]Feature{}),
132 .dependencies = sparseFeatureSet(&[_]Feature{}),
159133 };
160134 result[@enumToInt(Feature.mips1)] = .{
161 .index = @enumToInt(Feature.mips1),
162 .name = @tagName(Feature.mips1),
163135 .llvm_name = "mips1",
164136 .description = "Mips I ISA Support [highly experimental]",
165 .dependencies = featureSet(&[_]Feature{}),
137 .dependencies = sparseFeatureSet(&[_]Feature{}),
166138 };
167139 result[@enumToInt(Feature.mips16)] = .{
168 .index = @enumToInt(Feature.mips16),
169 .name = @tagName(Feature.mips16),
170140 .llvm_name = "mips16",
171141 .description = "Mips16 mode",
172 .dependencies = featureSet(&[_]Feature{}),
142 .dependencies = sparseFeatureSet(&[_]Feature{}),
173143 };
174144 result[@enumToInt(Feature.mips2)] = .{
175 .index = @enumToInt(Feature.mips2),
176 .name = @tagName(Feature.mips2),
177145 .llvm_name = "mips2",
178146 .description = "Mips II ISA Support [highly experimental]",
179 .dependencies = featureSet(&[_]Feature{
147 .dependencies = sparseFeatureSet(&[_]Feature{
180148 .mips1,
181149 }),
182150 };
183151 result[@enumToInt(Feature.mips3)] = .{
184 .index = @enumToInt(Feature.mips3),
185 .name = @tagName(Feature.mips3),
186152 .llvm_name = "mips3",
187153 .description = "MIPS III ISA Support [highly experimental]",
188 .dependencies = featureSet(&[_]Feature{
154 .dependencies = sparseFeatureSet(&[_]Feature{
189155 .fp64,
190156 .gp64,
191157 .mips2,
......@@ -194,22 +160,18 @@ pub const all_features = blk: {
194160 }),
195161 };
196162 result[@enumToInt(Feature.mips32)] = .{
197 .index = @enumToInt(Feature.mips32),
198 .name = @tagName(Feature.mips32),
199163 .llvm_name = "mips32",
200164 .description = "Mips32 ISA Support",
201 .dependencies = featureSet(&[_]Feature{
165 .dependencies = sparseFeatureSet(&[_]Feature{
202166 .mips2,
203167 .mips3_32,
204168 .mips4_32,
205169 }),
206170 };
207171 result[@enumToInt(Feature.mips32r2)] = .{
208 .index = @enumToInt(Feature.mips32r2),
209 .name = @tagName(Feature.mips32r2),
210172 .llvm_name = "mips32r2",
211173 .description = "Mips32r2 ISA Support",
212 .dependencies = featureSet(&[_]Feature{
174 .dependencies = sparseFeatureSet(&[_]Feature{
213175 .mips32,
214176 .mips3_32r2,
215177 .mips4_32r2,
......@@ -217,29 +179,23 @@ pub const all_features = blk: {
217179 }),
218180 };
219181 result[@enumToInt(Feature.mips32r3)] = .{
220 .index = @enumToInt(Feature.mips32r3),
221 .name = @tagName(Feature.mips32r3),
222182 .llvm_name = "mips32r3",
223183 .description = "Mips32r3 ISA Support",
224 .dependencies = featureSet(&[_]Feature{
184 .dependencies = sparseFeatureSet(&[_]Feature{
225185 .mips32r2,
226186 }),
227187 };
228188 result[@enumToInt(Feature.mips32r5)] = .{
229 .index = @enumToInt(Feature.mips32r5),
230 .name = @tagName(Feature.mips32r5),
231189 .llvm_name = "mips32r5",
232190 .description = "Mips32r5 ISA Support",
233 .dependencies = featureSet(&[_]Feature{
191 .dependencies = sparseFeatureSet(&[_]Feature{
234192 .mips32r3,
235193 }),
236194 };
237195 result[@enumToInt(Feature.mips32r6)] = .{
238 .index = @enumToInt(Feature.mips32r6),
239 .name = @tagName(Feature.mips32r6),
240196 .llvm_name = "mips32r6",
241197 .description = "Mips32r6 ISA Support [experimental]",
242 .dependencies = featureSet(&[_]Feature{
198 .dependencies = sparseFeatureSet(&[_]Feature{
243199 .abs2008,
244200 .fp64,
245201 .mips32r5,
......@@ -247,107 +203,83 @@ pub const all_features = blk: {
247203 }),
248204 };
249205 result[@enumToInt(Feature.mips3_32)] = .{
250 .index = @enumToInt(Feature.mips3_32),
251 .name = @tagName(Feature.mips3_32),
252206 .llvm_name = "mips3_32",
253207 .description = "Subset of MIPS-III that is also in MIPS32 [highly experimental]",
254 .dependencies = featureSet(&[_]Feature{}),
208 .dependencies = sparseFeatureSet(&[_]Feature{}),
255209 };
256210 result[@enumToInt(Feature.mips3_32r2)] = .{
257 .index = @enumToInt(Feature.mips3_32r2),
258 .name = @tagName(Feature.mips3_32r2),
259211 .llvm_name = "mips3_32r2",
260212 .description = "Subset of MIPS-III that is also in MIPS32r2 [highly experimental]",
261 .dependencies = featureSet(&[_]Feature{}),
213 .dependencies = sparseFeatureSet(&[_]Feature{}),
262214 };
263215 result[@enumToInt(Feature.mips4)] = .{
264 .index = @enumToInt(Feature.mips4),
265 .name = @tagName(Feature.mips4),
266216 .llvm_name = "mips4",
267217 .description = "MIPS IV ISA Support",
268 .dependencies = featureSet(&[_]Feature{
218 .dependencies = sparseFeatureSet(&[_]Feature{
269219 .mips3,
270220 .mips4_32,
271221 .mips4_32r2,
272222 }),
273223 };
274224 result[@enumToInt(Feature.mips4_32)] = .{
275 .index = @enumToInt(Feature.mips4_32),
276 .name = @tagName(Feature.mips4_32),
277225 .llvm_name = "mips4_32",
278226 .description = "Subset of MIPS-IV that is also in MIPS32 [highly experimental]",
279 .dependencies = featureSet(&[_]Feature{}),
227 .dependencies = sparseFeatureSet(&[_]Feature{}),
280228 };
281229 result[@enumToInt(Feature.mips4_32r2)] = .{
282 .index = @enumToInt(Feature.mips4_32r2),
283 .name = @tagName(Feature.mips4_32r2),
284230 .llvm_name = "mips4_32r2",
285231 .description = "Subset of MIPS-IV that is also in MIPS32r2 [highly experimental]",
286 .dependencies = featureSet(&[_]Feature{}),
232 .dependencies = sparseFeatureSet(&[_]Feature{}),
287233 };
288234 result[@enumToInt(Feature.mips5)] = .{
289 .index = @enumToInt(Feature.mips5),
290 .name = @tagName(Feature.mips5),
291235 .llvm_name = "mips5",
292236 .description = "MIPS V ISA Support [highly experimental]",
293 .dependencies = featureSet(&[_]Feature{
237 .dependencies = sparseFeatureSet(&[_]Feature{
294238 .mips4,
295239 .mips5_32r2,
296240 }),
297241 };
298242 result[@enumToInt(Feature.mips5_32r2)] = .{
299 .index = @enumToInt(Feature.mips5_32r2),
300 .name = @tagName(Feature.mips5_32r2),
301243 .llvm_name = "mips5_32r2",
302244 .description = "Subset of MIPS-V that is also in MIPS32r2 [highly experimental]",
303 .dependencies = featureSet(&[_]Feature{}),
245 .dependencies = sparseFeatureSet(&[_]Feature{}),
304246 };
305247 result[@enumToInt(Feature.mips64)] = .{
306 .index = @enumToInt(Feature.mips64),
307 .name = @tagName(Feature.mips64),
308248 .llvm_name = "mips64",
309249 .description = "Mips64 ISA Support",
310 .dependencies = featureSet(&[_]Feature{
250 .dependencies = sparseFeatureSet(&[_]Feature{
311251 .mips32,
312252 .mips5,
313253 }),
314254 };
315255 result[@enumToInt(Feature.mips64r2)] = .{
316 .index = @enumToInt(Feature.mips64r2),
317 .name = @tagName(Feature.mips64r2),
318256 .llvm_name = "mips64r2",
319257 .description = "Mips64r2 ISA Support",
320 .dependencies = featureSet(&[_]Feature{
258 .dependencies = sparseFeatureSet(&[_]Feature{
321259 .mips32r2,
322260 .mips64,
323261 }),
324262 };
325263 result[@enumToInt(Feature.mips64r3)] = .{
326 .index = @enumToInt(Feature.mips64r3),
327 .name = @tagName(Feature.mips64r3),
328264 .llvm_name = "mips64r3",
329265 .description = "Mips64r3 ISA Support",
330 .dependencies = featureSet(&[_]Feature{
266 .dependencies = sparseFeatureSet(&[_]Feature{
331267 .mips32r3,
332268 .mips64r2,
333269 }),
334270 };
335271 result[@enumToInt(Feature.mips64r5)] = .{
336 .index = @enumToInt(Feature.mips64r5),
337 .name = @tagName(Feature.mips64r5),
338272 .llvm_name = "mips64r5",
339273 .description = "Mips64r5 ISA Support",
340 .dependencies = featureSet(&[_]Feature{
274 .dependencies = sparseFeatureSet(&[_]Feature{
341275 .mips32r5,
342276 .mips64r3,
343277 }),
344278 };
345279 result[@enumToInt(Feature.mips64r6)] = .{
346 .index = @enumToInt(Feature.mips64r6),
347 .name = @tagName(Feature.mips64r6),
348280 .llvm_name = "mips64r6",
349281 .description = "Mips64r6 ISA Support [experimental]",
350 .dependencies = featureSet(&[_]Feature{
282 .dependencies = sparseFeatureSet(&[_]Feature{
351283 .abs2008,
352284 .mips32r6,
353285 .mips64r5,
......@@ -355,112 +287,88 @@ pub const all_features = blk: {
355287 }),
356288 };
357289 result[@enumToInt(Feature.msa)] = .{
358 .index = @enumToInt(Feature.msa),
359 .name = @tagName(Feature.msa),
360290 .llvm_name = "msa",
361291 .description = "Mips MSA ASE",
362 .dependencies = featureSet(&[_]Feature{}),
292 .dependencies = sparseFeatureSet(&[_]Feature{}),
363293 };
364294 result[@enumToInt(Feature.mt)] = .{
365 .index = @enumToInt(Feature.mt),
366 .name = @tagName(Feature.mt),
367295 .llvm_name = "mt",
368296 .description = "Mips MT ASE",
369 .dependencies = featureSet(&[_]Feature{}),
297 .dependencies = sparseFeatureSet(&[_]Feature{}),
370298 };
371299 result[@enumToInt(Feature.nan2008)] = .{
372 .index = @enumToInt(Feature.nan2008),
373 .name = @tagName(Feature.nan2008),
374300 .llvm_name = "nan2008",
375301 .description = "IEEE 754-2008 NaN encoding",
376 .dependencies = featureSet(&[_]Feature{}),
302 .dependencies = sparseFeatureSet(&[_]Feature{}),
377303 };
378304 result[@enumToInt(Feature.noabicalls)] = .{
379 .index = @enumToInt(Feature.noabicalls),
380 .name = @tagName(Feature.noabicalls),
381305 .llvm_name = "noabicalls",
382306 .description = "Disable SVR4-style position-independent code",
383 .dependencies = featureSet(&[_]Feature{}),
307 .dependencies = sparseFeatureSet(&[_]Feature{}),
384308 };
385309 result[@enumToInt(Feature.nomadd4)] = .{
386 .index = @enumToInt(Feature.nomadd4),
387 .name = @tagName(Feature.nomadd4),
388310 .llvm_name = "nomadd4",
389311 .description = "Disable 4-operand madd.fmt and related instructions",
390 .dependencies = featureSet(&[_]Feature{}),
312 .dependencies = sparseFeatureSet(&[_]Feature{}),
391313 };
392314 result[@enumToInt(Feature.nooddspreg)] = .{
393 .index = @enumToInt(Feature.nooddspreg),
394 .name = @tagName(Feature.nooddspreg),
395315 .llvm_name = "nooddspreg",
396316 .description = "Disable odd numbered single-precision registers",
397 .dependencies = featureSet(&[_]Feature{}),
317 .dependencies = sparseFeatureSet(&[_]Feature{}),
398318 };
399319 result[@enumToInt(Feature.p5600)] = .{
400 .index = @enumToInt(Feature.p5600),
401 .name = @tagName(Feature.p5600),
402320 .llvm_name = "p5600",
403321 .description = "The P5600 Processor",
404 .dependencies = featureSet(&[_]Feature{
322 .dependencies = sparseFeatureSet(&[_]Feature{
405323 .mips32r5,
406324 }),
407325 };
408326 result[@enumToInt(Feature.ptr64)] = .{
409 .index = @enumToInt(Feature.ptr64),
410 .name = @tagName(Feature.ptr64),
411327 .llvm_name = "ptr64",
412328 .description = "Pointers are 64-bit wide",
413 .dependencies = featureSet(&[_]Feature{}),
329 .dependencies = sparseFeatureSet(&[_]Feature{}),
414330 };
415331 result[@enumToInt(Feature.single_float)] = .{
416 .index = @enumToInt(Feature.single_float),
417 .name = @tagName(Feature.single_float),
418332 .llvm_name = "single-float",
419333 .description = "Only supports single precision float",
420 .dependencies = featureSet(&[_]Feature{}),
334 .dependencies = sparseFeatureSet(&[_]Feature{}),
421335 };
422336 result[@enumToInt(Feature.soft_float)] = .{
423 .index = @enumToInt(Feature.soft_float),
424 .name = @tagName(Feature.soft_float),
425337 .llvm_name = "soft-float",
426338 .description = "Does not support floating point instructions",
427 .dependencies = featureSet(&[_]Feature{}),
339 .dependencies = sparseFeatureSet(&[_]Feature{}),
428340 };
429341 result[@enumToInt(Feature.sym32)] = .{
430 .index = @enumToInt(Feature.sym32),
431 .name = @tagName(Feature.sym32),
432342 .llvm_name = "sym32",
433343 .description = "Symbols are 32 bit on Mips64",
434 .dependencies = featureSet(&[_]Feature{}),
344 .dependencies = sparseFeatureSet(&[_]Feature{}),
435345 };
436346 result[@enumToInt(Feature.use_indirect_jump_hazard)] = .{
437 .index = @enumToInt(Feature.use_indirect_jump_hazard),
438 .name = @tagName(Feature.use_indirect_jump_hazard),
439347 .llvm_name = "use-indirect-jump-hazard",
440348 .description = "Use indirect jump guards to prevent certain speculation based attacks",
441 .dependencies = featureSet(&[_]Feature{}),
349 .dependencies = sparseFeatureSet(&[_]Feature{}),
442350 };
443351 result[@enumToInt(Feature.use_tcc_in_div)] = .{
444 .index = @enumToInt(Feature.use_tcc_in_div),
445 .name = @tagName(Feature.use_tcc_in_div),
446352 .llvm_name = "use-tcc-in-div",
447353 .description = "Force the assembler to use trapping",
448 .dependencies = featureSet(&[_]Feature{}),
354 .dependencies = sparseFeatureSet(&[_]Feature{}),
449355 };
450356 result[@enumToInt(Feature.vfpu)] = .{
451 .index = @enumToInt(Feature.vfpu),
452 .name = @tagName(Feature.vfpu),
453357 .llvm_name = "vfpu",
454358 .description = "Enable vector FPU instructions",
455 .dependencies = featureSet(&[_]Feature{}),
359 .dependencies = sparseFeatureSet(&[_]Feature{}),
456360 };
457361 result[@enumToInt(Feature.virt)] = .{
458 .index = @enumToInt(Feature.virt),
459 .name = @tagName(Feature.virt),
460362 .llvm_name = "virt",
461363 .description = "Mips Virtualization ASE",
462 .dependencies = featureSet(&[_]Feature{}),
463 };
364 .dependencies = sparseFeatureSet(&[_]Feature{}),
365 };
366 const ti = @typeInfo(Feature);
367 for (result) |*elem, i| {
368 elem.index = i;
369 elem.name = ti.Enum.fields[i].name;
370 elem.dependencies.initAsDependencies(i, &result);
371 }
464372 break :blk result;
465373};
466374
......@@ -468,112 +376,112 @@ pub const cpu = struct {
468376 pub const mips1 = Cpu{
469377 .name = "mips1",
470378 .llvm_name = "mips1",
471 .features = featureSet(&[_]Feature{
379 .features = featureSet(&all_features, &[_]Feature{
472380 .mips1,
473381 }),
474382 };
475383 pub const mips2 = Cpu{
476384 .name = "mips2",
477385 .llvm_name = "mips2",
478 .features = featureSet(&[_]Feature{
386 .features = featureSet(&all_features, &[_]Feature{
479387 .mips2,
480388 }),
481389 };
482390 pub const mips3 = Cpu{
483391 .name = "mips3",
484392 .llvm_name = "mips3",
485 .features = featureSet(&[_]Feature{
393 .features = featureSet(&all_features, &[_]Feature{
486394 .mips3,
487395 }),
488396 };
489397 pub const mips32 = Cpu{
490398 .name = "mips32",
491399 .llvm_name = "mips32",
492 .features = featureSet(&[_]Feature{
400 .features = featureSet(&all_features, &[_]Feature{
493401 .mips32,
494402 }),
495403 };
496404 pub const mips32r2 = Cpu{
497405 .name = "mips32r2",
498406 .llvm_name = "mips32r2",
499 .features = featureSet(&[_]Feature{
407 .features = featureSet(&all_features, &[_]Feature{
500408 .mips32r2,
501409 }),
502410 };
503411 pub const mips32r3 = Cpu{
504412 .name = "mips32r3",
505413 .llvm_name = "mips32r3",
506 .features = featureSet(&[_]Feature{
414 .features = featureSet(&all_features, &[_]Feature{
507415 .mips32r3,
508416 }),
509417 };
510418 pub const mips32r5 = Cpu{
511419 .name = "mips32r5",
512420 .llvm_name = "mips32r5",
513 .features = featureSet(&[_]Feature{
421 .features = featureSet(&all_features, &[_]Feature{
514422 .mips32r5,
515423 }),
516424 };
517425 pub const mips32r6 = Cpu{
518426 .name = "mips32r6",
519427 .llvm_name = "mips32r6",
520 .features = featureSet(&[_]Feature{
428 .features = featureSet(&all_features, &[_]Feature{
521429 .mips32r6,
522430 }),
523431 };
524432 pub const mips4 = Cpu{
525433 .name = "mips4",
526434 .llvm_name = "mips4",
527 .features = featureSet(&[_]Feature{
435 .features = featureSet(&all_features, &[_]Feature{
528436 .mips4,
529437 }),
530438 };
531439 pub const mips5 = Cpu{
532440 .name = "mips5",
533441 .llvm_name = "mips5",
534 .features = featureSet(&[_]Feature{
442 .features = featureSet(&all_features, &[_]Feature{
535443 .mips5,
536444 }),
537445 };
538446 pub const mips64 = Cpu{
539447 .name = "mips64",
540448 .llvm_name = "mips64",
541 .features = featureSet(&[_]Feature{
449 .features = featureSet(&all_features, &[_]Feature{
542450 .mips64,
543451 }),
544452 };
545453 pub const mips64r2 = Cpu{
546454 .name = "mips64r2",
547455 .llvm_name = "mips64r2",
548 .features = featureSet(&[_]Feature{
456 .features = featureSet(&all_features, &[_]Feature{
549457 .mips64r2,
550458 }),
551459 };
552460 pub const mips64r3 = Cpu{
553461 .name = "mips64r3",
554462 .llvm_name = "mips64r3",
555 .features = featureSet(&[_]Feature{
463 .features = featureSet(&all_features, &[_]Feature{
556464 .mips64r3,
557465 }),
558466 };
559467 pub const mips64r5 = Cpu{
560468 .name = "mips64r5",
561469 .llvm_name = "mips64r5",
562 .features = featureSet(&[_]Feature{
470 .features = featureSet(&all_features, &[_]Feature{
563471 .mips64r5,
564472 }),
565473 };
566474 pub const mips64r6 = Cpu{
567475 .name = "mips64r6",
568476 .llvm_name = "mips64r6",
569 .features = featureSet(&[_]Feature{
477 .features = featureSet(&all_features, &[_]Feature{
570478 .mips64r6,
571479 }),
572480 };
573481 pub const octeon = Cpu{
574482 .name = "octeon",
575483 .llvm_name = "octeon",
576 .features = featureSet(&[_]Feature{
484 .features = featureSet(&all_features, &[_]Feature{
577485 .cnmips,
578486 .mips64r2,
579487 }),
......@@ -581,7 +489,7 @@ pub const cpu = struct {
581489 pub const p5600 = Cpu{
582490 .name = "p5600",
583491 .llvm_name = "p5600",
584 .features = featureSet(&[_]Feature{
492 .features = featureSet(&all_features, &[_]Feature{
585493 .p5600,
586494 }),
587495 };
lib/std/target/msp430.zig+14-16
......@@ -12,36 +12,34 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
1212
1313pub const all_features = blk: {
1414 const len = @typeInfo(Feature).Enum.fields.len;
15 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
15 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
1616 var result: [len]Cpu.Feature = undefined;
1717 result[@enumToInt(Feature.ext)] = .{
18 .index = @enumToInt(Feature.ext),
19 .name = @tagName(Feature.ext),
2018 .llvm_name = "ext",
2119 .description = "Enable MSP430-X extensions",
22 .dependencies = featureSet(&[_]Feature{}),
20 .dependencies = sparseFeatureSet(&[_]Feature{}),
2321 };
2422 result[@enumToInt(Feature.hwmult16)] = .{
25 .index = @enumToInt(Feature.hwmult16),
26 .name = @tagName(Feature.hwmult16),
2723 .llvm_name = "hwmult16",
2824 .description = "Enable 16-bit hardware multiplier",
29 .dependencies = featureSet(&[_]Feature{}),
25 .dependencies = sparseFeatureSet(&[_]Feature{}),
3026 };
3127 result[@enumToInt(Feature.hwmult32)] = .{
32 .index = @enumToInt(Feature.hwmult32),
33 .name = @tagName(Feature.hwmult32),
3428 .llvm_name = "hwmult32",
3529 .description = "Enable 32-bit hardware multiplier",
36 .dependencies = featureSet(&[_]Feature{}),
30 .dependencies = sparseFeatureSet(&[_]Feature{}),
3731 };
3832 result[@enumToInt(Feature.hwmultf5)] = .{
39 .index = @enumToInt(Feature.hwmultf5),
40 .name = @tagName(Feature.hwmultf5),
4133 .llvm_name = "hwmultf5",
4234 .description = "Enable F5 series hardware multiplier",
43 .dependencies = featureSet(&[_]Feature{}),
35 .dependencies = sparseFeatureSet(&[_]Feature{}),
4436 };
37 const ti = @typeInfo(Feature);
38 for (result) |*elem, i| {
39 elem.index = i;
40 elem.name = ti.Enum.fields[i].name;
41 elem.dependencies.initAsDependencies(i, &result);
42 }
4543 break :blk result;
4644};
4745
......@@ -49,17 +47,17 @@ pub const cpu = struct {
4947 pub const generic = Cpu{
5048 .name = "generic",
5149 .llvm_name = "generic",
52 .features = featureSet(&[_]Feature{}),
50 .features = featureSet(&all_features, &[_]Feature{}),
5351 };
5452 pub const msp430 = Cpu{
5553 .name = "msp430",
5654 .llvm_name = "msp430",
57 .features = featureSet(&[_]Feature{}),
55 .features = featureSet(&all_features, &[_]Feature{}),
5856 };
5957 pub const msp430x = Cpu{
6058 .name = "msp430x",
6159 .llvm_name = "msp430x",
62 .features = featureSet(&[_]Feature{
60 .features = featureSet(&all_features, &[_]Feature{
6361 .ext,
6462 }),
6563 };
lib/std/target/nvptx.zig+48-92
......@@ -33,183 +33,139 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
3333
3434pub const all_features = blk: {
3535 const len = @typeInfo(Feature).Enum.fields.len;
36 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
36 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
3737 var result: [len]Cpu.Feature = undefined;
3838 result[@enumToInt(Feature.ptx32)] = .{
39 .index = @enumToInt(Feature.ptx32),
40 .name = @tagName(Feature.ptx32),
4139 .llvm_name = "ptx32",
4240 .description = "Use PTX version 3.2",
43 .dependencies = featureSet(&[_]Feature{}),
41 .dependencies = sparseFeatureSet(&[_]Feature{}),
4442 };
4543 result[@enumToInt(Feature.ptx40)] = .{
46 .index = @enumToInt(Feature.ptx40),
47 .name = @tagName(Feature.ptx40),
4844 .llvm_name = "ptx40",
4945 .description = "Use PTX version 4.0",
50 .dependencies = featureSet(&[_]Feature{}),
46 .dependencies = sparseFeatureSet(&[_]Feature{}),
5147 };
5248 result[@enumToInt(Feature.ptx41)] = .{
53 .index = @enumToInt(Feature.ptx41),
54 .name = @tagName(Feature.ptx41),
5549 .llvm_name = "ptx41",
5650 .description = "Use PTX version 4.1",
57 .dependencies = featureSet(&[_]Feature{}),
51 .dependencies = sparseFeatureSet(&[_]Feature{}),
5852 };
5953 result[@enumToInt(Feature.ptx42)] = .{
60 .index = @enumToInt(Feature.ptx42),
61 .name = @tagName(Feature.ptx42),
6254 .llvm_name = "ptx42",
6355 .description = "Use PTX version 4.2",
64 .dependencies = featureSet(&[_]Feature{}),
56 .dependencies = sparseFeatureSet(&[_]Feature{}),
6557 };
6658 result[@enumToInt(Feature.ptx43)] = .{
67 .index = @enumToInt(Feature.ptx43),
68 .name = @tagName(Feature.ptx43),
6959 .llvm_name = "ptx43",
7060 .description = "Use PTX version 4.3",
71 .dependencies = featureSet(&[_]Feature{}),
61 .dependencies = sparseFeatureSet(&[_]Feature{}),
7262 };
7363 result[@enumToInt(Feature.ptx50)] = .{
74 .index = @enumToInt(Feature.ptx50),
75 .name = @tagName(Feature.ptx50),
7664 .llvm_name = "ptx50",
7765 .description = "Use PTX version 5.0",
78 .dependencies = featureSet(&[_]Feature{}),
66 .dependencies = sparseFeatureSet(&[_]Feature{}),
7967 };
8068 result[@enumToInt(Feature.ptx60)] = .{
81 .index = @enumToInt(Feature.ptx60),
82 .name = @tagName(Feature.ptx60),
8369 .llvm_name = "ptx60",
8470 .description = "Use PTX version 6.0",
85 .dependencies = featureSet(&[_]Feature{}),
71 .dependencies = sparseFeatureSet(&[_]Feature{}),
8672 };
8773 result[@enumToInt(Feature.ptx61)] = .{
88 .index = @enumToInt(Feature.ptx61),
89 .name = @tagName(Feature.ptx61),
9074 .llvm_name = "ptx61",
9175 .description = "Use PTX version 6.1",
92 .dependencies = featureSet(&[_]Feature{}),
76 .dependencies = sparseFeatureSet(&[_]Feature{}),
9377 };
9478 result[@enumToInt(Feature.ptx63)] = .{
95 .index = @enumToInt(Feature.ptx63),
96 .name = @tagName(Feature.ptx63),
9779 .llvm_name = "ptx63",
9880 .description = "Use PTX version 6.3",
99 .dependencies = featureSet(&[_]Feature{}),
81 .dependencies = sparseFeatureSet(&[_]Feature{}),
10082 };
10183 result[@enumToInt(Feature.ptx64)] = .{
102 .index = @enumToInt(Feature.ptx64),
103 .name = @tagName(Feature.ptx64),
10484 .llvm_name = "ptx64",
10585 .description = "Use PTX version 6.4",
106 .dependencies = featureSet(&[_]Feature{}),
86 .dependencies = sparseFeatureSet(&[_]Feature{}),
10787 };
10888 result[@enumToInt(Feature.sm_20)] = .{
109 .index = @enumToInt(Feature.sm_20),
110 .name = @tagName(Feature.sm_20),
11189 .llvm_name = "sm_20",
11290 .description = "Target SM 2.0",
113 .dependencies = featureSet(&[_]Feature{}),
91 .dependencies = sparseFeatureSet(&[_]Feature{}),
11492 };
11593 result[@enumToInt(Feature.sm_21)] = .{
116 .index = @enumToInt(Feature.sm_21),
117 .name = @tagName(Feature.sm_21),
11894 .llvm_name = "sm_21",
11995 .description = "Target SM 2.1",
120 .dependencies = featureSet(&[_]Feature{}),
96 .dependencies = sparseFeatureSet(&[_]Feature{}),
12197 };
12298 result[@enumToInt(Feature.sm_30)] = .{
123 .index = @enumToInt(Feature.sm_30),
124 .name = @tagName(Feature.sm_30),
12599 .llvm_name = "sm_30",
126100 .description = "Target SM 3.0",
127 .dependencies = featureSet(&[_]Feature{}),
101 .dependencies = sparseFeatureSet(&[_]Feature{}),
128102 };
129103 result[@enumToInt(Feature.sm_32)] = .{
130 .index = @enumToInt(Feature.sm_32),
131 .name = @tagName(Feature.sm_32),
132104 .llvm_name = "sm_32",
133105 .description = "Target SM 3.2",
134 .dependencies = featureSet(&[_]Feature{}),
106 .dependencies = sparseFeatureSet(&[_]Feature{}),
135107 };
136108 result[@enumToInt(Feature.sm_35)] = .{
137 .index = @enumToInt(Feature.sm_35),
138 .name = @tagName(Feature.sm_35),
139109 .llvm_name = "sm_35",
140110 .description = "Target SM 3.5",
141 .dependencies = featureSet(&[_]Feature{}),
111 .dependencies = sparseFeatureSet(&[_]Feature{}),
142112 };
143113 result[@enumToInt(Feature.sm_37)] = .{
144 .index = @enumToInt(Feature.sm_37),
145 .name = @tagName(Feature.sm_37),
146114 .llvm_name = "sm_37",
147115 .description = "Target SM 3.7",
148 .dependencies = featureSet(&[_]Feature{}),
116 .dependencies = sparseFeatureSet(&[_]Feature{}),
149117 };
150118 result[@enumToInt(Feature.sm_50)] = .{
151 .index = @enumToInt(Feature.sm_50),
152 .name = @tagName(Feature.sm_50),
153119 .llvm_name = "sm_50",
154120 .description = "Target SM 5.0",
155 .dependencies = featureSet(&[_]Feature{}),
121 .dependencies = sparseFeatureSet(&[_]Feature{}),
156122 };
157123 result[@enumToInt(Feature.sm_52)] = .{
158 .index = @enumToInt(Feature.sm_52),
159 .name = @tagName(Feature.sm_52),
160124 .llvm_name = "sm_52",
161125 .description = "Target SM 5.2",
162 .dependencies = featureSet(&[_]Feature{}),
126 .dependencies = sparseFeatureSet(&[_]Feature{}),
163127 };
164128 result[@enumToInt(Feature.sm_53)] = .{
165 .index = @enumToInt(Feature.sm_53),
166 .name = @tagName(Feature.sm_53),
167129 .llvm_name = "sm_53",
168130 .description = "Target SM 5.3",
169 .dependencies = featureSet(&[_]Feature{}),
131 .dependencies = sparseFeatureSet(&[_]Feature{}),
170132 };
171133 result[@enumToInt(Feature.sm_60)] = .{
172 .index = @enumToInt(Feature.sm_60),
173 .name = @tagName(Feature.sm_60),
174134 .llvm_name = "sm_60",
175135 .description = "Target SM 6.0",
176 .dependencies = featureSet(&[_]Feature{}),
136 .dependencies = sparseFeatureSet(&[_]Feature{}),
177137 };
178138 result[@enumToInt(Feature.sm_61)] = .{
179 .index = @enumToInt(Feature.sm_61),
180 .name = @tagName(Feature.sm_61),
181139 .llvm_name = "sm_61",
182140 .description = "Target SM 6.1",
183 .dependencies = featureSet(&[_]Feature{}),
141 .dependencies = sparseFeatureSet(&[_]Feature{}),
184142 };
185143 result[@enumToInt(Feature.sm_62)] = .{
186 .index = @enumToInt(Feature.sm_62),
187 .name = @tagName(Feature.sm_62),
188144 .llvm_name = "sm_62",
189145 .description = "Target SM 6.2",
190 .dependencies = featureSet(&[_]Feature{}),
146 .dependencies = sparseFeatureSet(&[_]Feature{}),
191147 };
192148 result[@enumToInt(Feature.sm_70)] = .{
193 .index = @enumToInt(Feature.sm_70),
194 .name = @tagName(Feature.sm_70),
195149 .llvm_name = "sm_70",
196150 .description = "Target SM 7.0",
197 .dependencies = featureSet(&[_]Feature{}),
151 .dependencies = sparseFeatureSet(&[_]Feature{}),
198152 };
199153 result[@enumToInt(Feature.sm_72)] = .{
200 .index = @enumToInt(Feature.sm_72),
201 .name = @tagName(Feature.sm_72),
202154 .llvm_name = "sm_72",
203155 .description = "Target SM 7.2",
204 .dependencies = featureSet(&[_]Feature{}),
156 .dependencies = sparseFeatureSet(&[_]Feature{}),
205157 };
206158 result[@enumToInt(Feature.sm_75)] = .{
207 .index = @enumToInt(Feature.sm_75),
208 .name = @tagName(Feature.sm_75),
209159 .llvm_name = "sm_75",
210160 .description = "Target SM 7.5",
211 .dependencies = featureSet(&[_]Feature{}),
212 };
161 .dependencies = sparseFeatureSet(&[_]Feature{}),
162 };
163 const ti = @typeInfo(Feature);
164 for (result) |*elem, i| {
165 elem.index = i;
166 elem.name = ti.Enum.fields[i].name;
167 elem.dependencies.initAsDependencies(i, &result);
168 }
213169 break :blk result;
214170};
215171
......@@ -217,28 +173,28 @@ pub const cpu = struct {
217173 pub const sm_20 = Cpu{
218174 .name = "sm_20",
219175 .llvm_name = "sm_20",
220 .features = featureSet(&[_]Feature{
176 .features = featureSet(&all_features, &[_]Feature{
221177 .sm_20,
222178 }),
223179 };
224180 pub const sm_21 = Cpu{
225181 .name = "sm_21",
226182 .llvm_name = "sm_21",
227 .features = featureSet(&[_]Feature{
183 .features = featureSet(&all_features, &[_]Feature{
228184 .sm_21,
229185 }),
230186 };
231187 pub const sm_30 = Cpu{
232188 .name = "sm_30",
233189 .llvm_name = "sm_30",
234 .features = featureSet(&[_]Feature{
190 .features = featureSet(&all_features, &[_]Feature{
235191 .sm_30,
236192 }),
237193 };
238194 pub const sm_32 = Cpu{
239195 .name = "sm_32",
240196 .llvm_name = "sm_32",
241 .features = featureSet(&[_]Feature{
197 .features = featureSet(&all_features, &[_]Feature{
242198 .ptx40,
243199 .sm_32,
244200 }),
......@@ -246,14 +202,14 @@ pub const cpu = struct {
246202 pub const sm_35 = Cpu{
247203 .name = "sm_35",
248204 .llvm_name = "sm_35",
249 .features = featureSet(&[_]Feature{
205 .features = featureSet(&all_features, &[_]Feature{
250206 .sm_35,
251207 }),
252208 };
253209 pub const sm_37 = Cpu{
254210 .name = "sm_37",
255211 .llvm_name = "sm_37",
256 .features = featureSet(&[_]Feature{
212 .features = featureSet(&all_features, &[_]Feature{
257213 .ptx41,
258214 .sm_37,
259215 }),
......@@ -261,7 +217,7 @@ pub const cpu = struct {
261217 pub const sm_50 = Cpu{
262218 .name = "sm_50",
263219 .llvm_name = "sm_50",
264 .features = featureSet(&[_]Feature{
220 .features = featureSet(&all_features, &[_]Feature{
265221 .ptx40,
266222 .sm_50,
267223 }),
......@@ -269,7 +225,7 @@ pub const cpu = struct {
269225 pub const sm_52 = Cpu{
270226 .name = "sm_52",
271227 .llvm_name = "sm_52",
272 .features = featureSet(&[_]Feature{
228 .features = featureSet(&all_features, &[_]Feature{
273229 .ptx41,
274230 .sm_52,
275231 }),
......@@ -277,7 +233,7 @@ pub const cpu = struct {
277233 pub const sm_53 = Cpu{
278234 .name = "sm_53",
279235 .llvm_name = "sm_53",
280 .features = featureSet(&[_]Feature{
236 .features = featureSet(&all_features, &[_]Feature{
281237 .ptx42,
282238 .sm_53,
283239 }),
......@@ -285,7 +241,7 @@ pub const cpu = struct {
285241 pub const sm_60 = Cpu{
286242 .name = "sm_60",
287243 .llvm_name = "sm_60",
288 .features = featureSet(&[_]Feature{
244 .features = featureSet(&all_features, &[_]Feature{
289245 .ptx50,
290246 .sm_60,
291247 }),
......@@ -293,7 +249,7 @@ pub const cpu = struct {
293249 pub const sm_61 = Cpu{
294250 .name = "sm_61",
295251 .llvm_name = "sm_61",
296 .features = featureSet(&[_]Feature{
252 .features = featureSet(&all_features, &[_]Feature{
297253 .ptx50,
298254 .sm_61,
299255 }),
......@@ -301,7 +257,7 @@ pub const cpu = struct {
301257 pub const sm_62 = Cpu{
302258 .name = "sm_62",
303259 .llvm_name = "sm_62",
304 .features = featureSet(&[_]Feature{
260 .features = featureSet(&all_features, &[_]Feature{
305261 .ptx50,
306262 .sm_62,
307263 }),
......@@ -309,7 +265,7 @@ pub const cpu = struct {
309265 pub const sm_70 = Cpu{
310266 .name = "sm_70",
311267 .llvm_name = "sm_70",
312 .features = featureSet(&[_]Feature{
268 .features = featureSet(&all_features, &[_]Feature{
313269 .ptx60,
314270 .sm_70,
315271 }),
......@@ -317,7 +273,7 @@ pub const cpu = struct {
317273 pub const sm_72 = Cpu{
318274 .name = "sm_72",
319275 .llvm_name = "sm_72",
320 .features = featureSet(&[_]Feature{
276 .features = featureSet(&all_features, &[_]Feature{
321277 .ptx61,
322278 .sm_72,
323279 }),
......@@ -325,7 +281,7 @@ pub const cpu = struct {
325281 pub const sm_75 = Cpu{
326282 .name = "sm_75",
327283 .llvm_name = "sm_75",
328 .features = featureSet(&[_]Feature{
284 .features = featureSet(&all_features, &[_]Feature{
329285 .ptx63,
330286 .sm_75,
331287 }),
lib/std/target/powerpc.zig+95-191
......@@ -59,417 +59,321 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
5959
6060pub const all_features = blk: {
6161 const len = @typeInfo(Feature).Enum.fields.len;
62 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
62 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
6363 var result: [len]Cpu.Feature = undefined;
6464 result[@enumToInt(Feature.@"64bit")] = .{
65 .index = @enumToInt(Feature.@"64bit"),
66 .name = @tagName(Feature.@"64bit"),
6765 .llvm_name = "64bit",
6866 .description = "Enable 64-bit instructions",
69 .dependencies = featureSet(&[_]Feature{}),
67 .dependencies = sparseFeatureSet(&[_]Feature{}),
7068 };
7169 result[@enumToInt(Feature.@"64bitregs")] = .{
72 .index = @enumToInt(Feature.@"64bitregs"),
73 .name = @tagName(Feature.@"64bitregs"),
7470 .llvm_name = "64bitregs",
7571 .description = "Enable 64-bit registers usage for ppc32 [beta]",
76 .dependencies = featureSet(&[_]Feature{}),
72 .dependencies = sparseFeatureSet(&[_]Feature{}),
7773 };
7874 result[@enumToInt(Feature.altivec)] = .{
79 .index = @enumToInt(Feature.altivec),
80 .name = @tagName(Feature.altivec),
8175 .llvm_name = "altivec",
8276 .description = "Enable Altivec instructions",
83 .dependencies = featureSet(&[_]Feature{
77 .dependencies = sparseFeatureSet(&[_]Feature{
8478 .fpu,
8579 }),
8680 };
8781 result[@enumToInt(Feature.booke)] = .{
88 .index = @enumToInt(Feature.booke),
89 .name = @tagName(Feature.booke),
9082 .llvm_name = "booke",
9183 .description = "Enable Book E instructions",
92 .dependencies = featureSet(&[_]Feature{
84 .dependencies = sparseFeatureSet(&[_]Feature{
9385 .icbt,
9486 }),
9587 };
9688 result[@enumToInt(Feature.bpermd)] = .{
97 .index = @enumToInt(Feature.bpermd),
98 .name = @tagName(Feature.bpermd),
9989 .llvm_name = "bpermd",
10090 .description = "Enable the bpermd instruction",
101 .dependencies = featureSet(&[_]Feature{}),
91 .dependencies = sparseFeatureSet(&[_]Feature{}),
10292 };
10393 result[@enumToInt(Feature.cmpb)] = .{
104 .index = @enumToInt(Feature.cmpb),
105 .name = @tagName(Feature.cmpb),
10694 .llvm_name = "cmpb",
10795 .description = "Enable the cmpb instruction",
108 .dependencies = featureSet(&[_]Feature{}),
96 .dependencies = sparseFeatureSet(&[_]Feature{}),
10997 };
11098 result[@enumToInt(Feature.crbits)] = .{
111 .index = @enumToInt(Feature.crbits),
112 .name = @tagName(Feature.crbits),
11399 .llvm_name = "crbits",
114100 .description = "Use condition-register bits individually",
115 .dependencies = featureSet(&[_]Feature{}),
101 .dependencies = sparseFeatureSet(&[_]Feature{}),
116102 };
117103 result[@enumToInt(Feature.crypto)] = .{
118 .index = @enumToInt(Feature.crypto),
119 .name = @tagName(Feature.crypto),
120104 .llvm_name = "crypto",
121105 .description = "Enable POWER8 Crypto instructions",
122 .dependencies = featureSet(&[_]Feature{
106 .dependencies = sparseFeatureSet(&[_]Feature{
123107 .power8_altivec,
124108 }),
125109 };
126110 result[@enumToInt(Feature.direct_move)] = .{
127 .index = @enumToInt(Feature.direct_move),
128 .name = @tagName(Feature.direct_move),
129111 .llvm_name = "direct-move",
130112 .description = "Enable Power8 direct move instructions",
131 .dependencies = featureSet(&[_]Feature{
113 .dependencies = sparseFeatureSet(&[_]Feature{
132114 .vsx,
133115 }),
134116 };
135117 result[@enumToInt(Feature.e500)] = .{
136 .index = @enumToInt(Feature.e500),
137 .name = @tagName(Feature.e500),
138118 .llvm_name = "e500",
139119 .description = "Enable E500/E500mc instructions",
140 .dependencies = featureSet(&[_]Feature{}),
120 .dependencies = sparseFeatureSet(&[_]Feature{}),
141121 };
142122 result[@enumToInt(Feature.extdiv)] = .{
143 .index = @enumToInt(Feature.extdiv),
144 .name = @tagName(Feature.extdiv),
145123 .llvm_name = "extdiv",
146124 .description = "Enable extended divide instructions",
147 .dependencies = featureSet(&[_]Feature{}),
125 .dependencies = sparseFeatureSet(&[_]Feature{}),
148126 };
149127 result[@enumToInt(Feature.fcpsgn)] = .{
150 .index = @enumToInt(Feature.fcpsgn),
151 .name = @tagName(Feature.fcpsgn),
152128 .llvm_name = "fcpsgn",
153129 .description = "Enable the fcpsgn instruction",
154 .dependencies = featureSet(&[_]Feature{
130 .dependencies = sparseFeatureSet(&[_]Feature{
155131 .fpu,
156132 }),
157133 };
158134 result[@enumToInt(Feature.float128)] = .{
159 .index = @enumToInt(Feature.float128),
160 .name = @tagName(Feature.float128),
161135 .llvm_name = "float128",
162136 .description = "Enable the __float128 data type for IEEE-754R Binary128.",
163 .dependencies = featureSet(&[_]Feature{
137 .dependencies = sparseFeatureSet(&[_]Feature{
164138 .vsx,
165139 }),
166140 };
167141 result[@enumToInt(Feature.fpcvt)] = .{
168 .index = @enumToInt(Feature.fpcvt),
169 .name = @tagName(Feature.fpcvt),
170142 .llvm_name = "fpcvt",
171143 .description = "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions",
172 .dependencies = featureSet(&[_]Feature{
144 .dependencies = sparseFeatureSet(&[_]Feature{
173145 .fpu,
174146 }),
175147 };
176148 result[@enumToInt(Feature.fprnd)] = .{
177 .index = @enumToInt(Feature.fprnd),
178 .name = @tagName(Feature.fprnd),
179149 .llvm_name = "fprnd",
180150 .description = "Enable the fri[mnpz] instructions",
181 .dependencies = featureSet(&[_]Feature{
151 .dependencies = sparseFeatureSet(&[_]Feature{
182152 .fpu,
183153 }),
184154 };
185155 result[@enumToInt(Feature.fpu)] = .{
186 .index = @enumToInt(Feature.fpu),
187 .name = @tagName(Feature.fpu),
188156 .llvm_name = "fpu",
189157 .description = "Enable classic FPU instructions",
190 .dependencies = featureSet(&[_]Feature{
158 .dependencies = sparseFeatureSet(&[_]Feature{
191159 .hard_float,
192160 }),
193161 };
194162 result[@enumToInt(Feature.fre)] = .{
195 .index = @enumToInt(Feature.fre),
196 .name = @tagName(Feature.fre),
197163 .llvm_name = "fre",
198164 .description = "Enable the fre instruction",
199 .dependencies = featureSet(&[_]Feature{
165 .dependencies = sparseFeatureSet(&[_]Feature{
200166 .fpu,
201167 }),
202168 };
203169 result[@enumToInt(Feature.fres)] = .{
204 .index = @enumToInt(Feature.fres),
205 .name = @tagName(Feature.fres),
206170 .llvm_name = "fres",
207171 .description = "Enable the fres instruction",
208 .dependencies = featureSet(&[_]Feature{
172 .dependencies = sparseFeatureSet(&[_]Feature{
209173 .fpu,
210174 }),
211175 };
212176 result[@enumToInt(Feature.frsqrte)] = .{
213 .index = @enumToInt(Feature.frsqrte),
214 .name = @tagName(Feature.frsqrte),
215177 .llvm_name = "frsqrte",
216178 .description = "Enable the frsqrte instruction",
217 .dependencies = featureSet(&[_]Feature{
179 .dependencies = sparseFeatureSet(&[_]Feature{
218180 .fpu,
219181 }),
220182 };
221183 result[@enumToInt(Feature.frsqrtes)] = .{
222 .index = @enumToInt(Feature.frsqrtes),
223 .name = @tagName(Feature.frsqrtes),
224184 .llvm_name = "frsqrtes",
225185 .description = "Enable the frsqrtes instruction",
226 .dependencies = featureSet(&[_]Feature{
186 .dependencies = sparseFeatureSet(&[_]Feature{
227187 .fpu,
228188 }),
229189 };
230190 result[@enumToInt(Feature.fsqrt)] = .{
231 .index = @enumToInt(Feature.fsqrt),
232 .name = @tagName(Feature.fsqrt),
233191 .llvm_name = "fsqrt",
234192 .description = "Enable the fsqrt instruction",
235 .dependencies = featureSet(&[_]Feature{
193 .dependencies = sparseFeatureSet(&[_]Feature{
236194 .fpu,
237195 }),
238196 };
239197 result[@enumToInt(Feature.hard_float)] = .{
240 .index = @enumToInt(Feature.hard_float),
241 .name = @tagName(Feature.hard_float),
242198 .llvm_name = "hard-float",
243199 .description = "Enable floating-point instructions",
244 .dependencies = featureSet(&[_]Feature{}),
200 .dependencies = sparseFeatureSet(&[_]Feature{}),
245201 };
246202 result[@enumToInt(Feature.htm)] = .{
247 .index = @enumToInt(Feature.htm),
248 .name = @tagName(Feature.htm),
249203 .llvm_name = "htm",
250204 .description = "Enable Hardware Transactional Memory instructions",
251 .dependencies = featureSet(&[_]Feature{}),
205 .dependencies = sparseFeatureSet(&[_]Feature{}),
252206 };
253207 result[@enumToInt(Feature.icbt)] = .{
254 .index = @enumToInt(Feature.icbt),
255 .name = @tagName(Feature.icbt),
256208 .llvm_name = "icbt",
257209 .description = "Enable icbt instruction",
258 .dependencies = featureSet(&[_]Feature{}),
210 .dependencies = sparseFeatureSet(&[_]Feature{}),
259211 };
260212 result[@enumToInt(Feature.invariant_function_descriptors)] = .{
261 .index = @enumToInt(Feature.invariant_function_descriptors),
262 .name = @tagName(Feature.invariant_function_descriptors),
263213 .llvm_name = "invariant-function-descriptors",
264214 .description = "Assume function descriptors are invariant",
265 .dependencies = featureSet(&[_]Feature{}),
215 .dependencies = sparseFeatureSet(&[_]Feature{}),
266216 };
267217 result[@enumToInt(Feature.isa_v30_instructions)] = .{
268 .index = @enumToInt(Feature.isa_v30_instructions),
269 .name = @tagName(Feature.isa_v30_instructions),
270218 .llvm_name = "isa-v30-instructions",
271219 .description = "Enable instructions added in ISA 3.0.",
272 .dependencies = featureSet(&[_]Feature{}),
220 .dependencies = sparseFeatureSet(&[_]Feature{}),
273221 };
274222 result[@enumToInt(Feature.isel)] = .{
275 .index = @enumToInt(Feature.isel),
276 .name = @tagName(Feature.isel),
277223 .llvm_name = "isel",
278224 .description = "Enable the isel instruction",
279 .dependencies = featureSet(&[_]Feature{}),
225 .dependencies = sparseFeatureSet(&[_]Feature{}),
280226 };
281227 result[@enumToInt(Feature.ldbrx)] = .{
282 .index = @enumToInt(Feature.ldbrx),
283 .name = @tagName(Feature.ldbrx),
284228 .llvm_name = "ldbrx",
285229 .description = "Enable the ldbrx instruction",
286 .dependencies = featureSet(&[_]Feature{}),
230 .dependencies = sparseFeatureSet(&[_]Feature{}),
287231 };
288232 result[@enumToInt(Feature.lfiwax)] = .{
289 .index = @enumToInt(Feature.lfiwax),
290 .name = @tagName(Feature.lfiwax),
291233 .llvm_name = "lfiwax",
292234 .description = "Enable the lfiwax instruction",
293 .dependencies = featureSet(&[_]Feature{
235 .dependencies = sparseFeatureSet(&[_]Feature{
294236 .fpu,
295237 }),
296238 };
297239 result[@enumToInt(Feature.longcall)] = .{
298 .index = @enumToInt(Feature.longcall),
299 .name = @tagName(Feature.longcall),
300240 .llvm_name = "longcall",
301241 .description = "Always use indirect calls",
302 .dependencies = featureSet(&[_]Feature{}),
242 .dependencies = sparseFeatureSet(&[_]Feature{}),
303243 };
304244 result[@enumToInt(Feature.mfocrf)] = .{
305 .index = @enumToInt(Feature.mfocrf),
306 .name = @tagName(Feature.mfocrf),
307245 .llvm_name = "mfocrf",
308246 .description = "Enable the MFOCRF instruction",
309 .dependencies = featureSet(&[_]Feature{}),
247 .dependencies = sparseFeatureSet(&[_]Feature{}),
310248 };
311249 result[@enumToInt(Feature.msync)] = .{
312 .index = @enumToInt(Feature.msync),
313 .name = @tagName(Feature.msync),
314250 .llvm_name = "msync",
315251 .description = "Has only the msync instruction instead of sync",
316 .dependencies = featureSet(&[_]Feature{
252 .dependencies = sparseFeatureSet(&[_]Feature{
317253 .booke,
318254 }),
319255 };
320256 result[@enumToInt(Feature.partword_atomics)] = .{
321 .index = @enumToInt(Feature.partword_atomics),
322 .name = @tagName(Feature.partword_atomics),
323257 .llvm_name = "partword-atomics",
324258 .description = "Enable l[bh]arx and st[bh]cx.",
325 .dependencies = featureSet(&[_]Feature{}),
259 .dependencies = sparseFeatureSet(&[_]Feature{}),
326260 };
327261 result[@enumToInt(Feature.popcntd)] = .{
328 .index = @enumToInt(Feature.popcntd),
329 .name = @tagName(Feature.popcntd),
330262 .llvm_name = "popcntd",
331263 .description = "Enable the popcnt[dw] instructions",
332 .dependencies = featureSet(&[_]Feature{}),
264 .dependencies = sparseFeatureSet(&[_]Feature{}),
333265 };
334266 result[@enumToInt(Feature.power8_altivec)] = .{
335 .index = @enumToInt(Feature.power8_altivec),
336 .name = @tagName(Feature.power8_altivec),
337267 .llvm_name = "power8-altivec",
338268 .description = "Enable POWER8 Altivec instructions",
339 .dependencies = featureSet(&[_]Feature{
269 .dependencies = sparseFeatureSet(&[_]Feature{
340270 .altivec,
341271 }),
342272 };
343273 result[@enumToInt(Feature.power8_vector)] = .{
344 .index = @enumToInt(Feature.power8_vector),
345 .name = @tagName(Feature.power8_vector),
346274 .llvm_name = "power8-vector",
347275 .description = "Enable POWER8 vector instructions",
348 .dependencies = featureSet(&[_]Feature{
276 .dependencies = sparseFeatureSet(&[_]Feature{
349277 .power8_altivec,
350278 .vsx,
351279 }),
352280 };
353281 result[@enumToInt(Feature.power9_altivec)] = .{
354 .index = @enumToInt(Feature.power9_altivec),
355 .name = @tagName(Feature.power9_altivec),
356282 .llvm_name = "power9-altivec",
357283 .description = "Enable POWER9 Altivec instructions",
358 .dependencies = featureSet(&[_]Feature{
284 .dependencies = sparseFeatureSet(&[_]Feature{
359285 .isa_v30_instructions,
360286 .power8_altivec,
361287 }),
362288 };
363289 result[@enumToInt(Feature.power9_vector)] = .{
364 .index = @enumToInt(Feature.power9_vector),
365 .name = @tagName(Feature.power9_vector),
366290 .llvm_name = "power9-vector",
367291 .description = "Enable POWER9 vector instructions",
368 .dependencies = featureSet(&[_]Feature{
292 .dependencies = sparseFeatureSet(&[_]Feature{
369293 .isa_v30_instructions,
370294 .power8_vector,
371295 .power9_altivec,
372296 }),
373297 };
374298 result[@enumToInt(Feature.ppc_postra_sched)] = .{
375 .index = @enumToInt(Feature.ppc_postra_sched),
376 .name = @tagName(Feature.ppc_postra_sched),
377299 .llvm_name = "ppc-postra-sched",
378300 .description = "Use PowerPC post-RA scheduling strategy",
379 .dependencies = featureSet(&[_]Feature{}),
301 .dependencies = sparseFeatureSet(&[_]Feature{}),
380302 };
381303 result[@enumToInt(Feature.ppc_prera_sched)] = .{
382 .index = @enumToInt(Feature.ppc_prera_sched),
383 .name = @tagName(Feature.ppc_prera_sched),
384304 .llvm_name = "ppc-prera-sched",
385305 .description = "Use PowerPC pre-RA scheduling strategy",
386 .dependencies = featureSet(&[_]Feature{}),
306 .dependencies = sparseFeatureSet(&[_]Feature{}),
387307 };
388308 result[@enumToInt(Feature.ppc4xx)] = .{
389 .index = @enumToInt(Feature.ppc4xx),
390 .name = @tagName(Feature.ppc4xx),
391309 .llvm_name = "ppc4xx",
392310 .description = "Enable PPC 4xx instructions",
393 .dependencies = featureSet(&[_]Feature{}),
311 .dependencies = sparseFeatureSet(&[_]Feature{}),
394312 };
395313 result[@enumToInt(Feature.ppc6xx)] = .{
396 .index = @enumToInt(Feature.ppc6xx),
397 .name = @tagName(Feature.ppc6xx),
398314 .llvm_name = "ppc6xx",
399315 .description = "Enable PPC 6xx instructions",
400 .dependencies = featureSet(&[_]Feature{}),
316 .dependencies = sparseFeatureSet(&[_]Feature{}),
401317 };
402318 result[@enumToInt(Feature.qpx)] = .{
403 .index = @enumToInt(Feature.qpx),
404 .name = @tagName(Feature.qpx),
405319 .llvm_name = "qpx",
406320 .description = "Enable QPX instructions",
407 .dependencies = featureSet(&[_]Feature{
321 .dependencies = sparseFeatureSet(&[_]Feature{
408322 .fpu,
409323 }),
410324 };
411325 result[@enumToInt(Feature.recipprec)] = .{
412 .index = @enumToInt(Feature.recipprec),
413 .name = @tagName(Feature.recipprec),
414326 .llvm_name = "recipprec",
415327 .description = "Assume higher precision reciprocal estimates",
416 .dependencies = featureSet(&[_]Feature{}),
328 .dependencies = sparseFeatureSet(&[_]Feature{}),
417329 };
418330 result[@enumToInt(Feature.secure_plt)] = .{
419 .index = @enumToInt(Feature.secure_plt),
420 .name = @tagName(Feature.secure_plt),
421331 .llvm_name = "secure-plt",
422332 .description = "Enable secure plt mode",
423 .dependencies = featureSet(&[_]Feature{}),
333 .dependencies = sparseFeatureSet(&[_]Feature{}),
424334 };
425335 result[@enumToInt(Feature.slow_popcntd)] = .{
426 .index = @enumToInt(Feature.slow_popcntd),
427 .name = @tagName(Feature.slow_popcntd),
428336 .llvm_name = "slow-popcntd",
429337 .description = "Has slow popcnt[dw] instructions",
430 .dependencies = featureSet(&[_]Feature{}),
338 .dependencies = sparseFeatureSet(&[_]Feature{}),
431339 };
432340 result[@enumToInt(Feature.spe)] = .{
433 .index = @enumToInt(Feature.spe),
434 .name = @tagName(Feature.spe),
435341 .llvm_name = "spe",
436342 .description = "Enable SPE instructions",
437 .dependencies = featureSet(&[_]Feature{
343 .dependencies = sparseFeatureSet(&[_]Feature{
438344 .hard_float,
439345 }),
440346 };
441347 result[@enumToInt(Feature.stfiwx)] = .{
442 .index = @enumToInt(Feature.stfiwx),
443 .name = @tagName(Feature.stfiwx),
444348 .llvm_name = "stfiwx",
445349 .description = "Enable the stfiwx instruction",
446 .dependencies = featureSet(&[_]Feature{
350 .dependencies = sparseFeatureSet(&[_]Feature{
447351 .fpu,
448352 }),
449353 };
450354 result[@enumToInt(Feature.two_const_nr)] = .{
451 .index = @enumToInt(Feature.two_const_nr),
452 .name = @tagName(Feature.two_const_nr),
453355 .llvm_name = "two-const-nr",
454356 .description = "Requires two constant Newton-Raphson computation",
455 .dependencies = featureSet(&[_]Feature{}),
357 .dependencies = sparseFeatureSet(&[_]Feature{}),
456358 };
457359 result[@enumToInt(Feature.vectors_use_two_units)] = .{
458 .index = @enumToInt(Feature.vectors_use_two_units),
459 .name = @tagName(Feature.vectors_use_two_units),
460360 .llvm_name = "vectors-use-two-units",
461361 .description = "Vectors use two units",
462 .dependencies = featureSet(&[_]Feature{}),
362 .dependencies = sparseFeatureSet(&[_]Feature{}),
463363 };
464364 result[@enumToInt(Feature.vsx)] = .{
465 .index = @enumToInt(Feature.vsx),
466 .name = @tagName(Feature.vsx),
467365 .llvm_name = "vsx",
468366 .description = "Enable VSX instructions",
469 .dependencies = featureSet(&[_]Feature{
367 .dependencies = sparseFeatureSet(&[_]Feature{
470368 .altivec,
471369 }),
472370 };
371 const ti = @typeInfo(Feature);
372 for (result) |*elem, i| {
373 elem.index = i;
374 elem.name = ti.Enum.fields[i].name;
375 elem.dependencies.initAsDependencies(i, &result);
376 }
473377 break :blk result;
474378};
475379
......@@ -477,7 +381,7 @@ pub const cpu = struct {
477381 pub const @"440" = Cpu{
478382 .name = "440",
479383 .llvm_name = "440",
480 .features = featureSet(&[_]Feature{
384 .features = featureSet(&all_features, &[_]Feature{
481385 .booke,
482386 .fres,
483387 .frsqrte,
......@@ -489,7 +393,7 @@ pub const cpu = struct {
489393 pub const @"450" = Cpu{
490394 .name = "450",
491395 .llvm_name = "450",
492 .features = featureSet(&[_]Feature{
396 .features = featureSet(&all_features, &[_]Feature{
493397 .booke,
494398 .fres,
495399 .frsqrte,
......@@ -501,21 +405,21 @@ pub const cpu = struct {
501405 pub const @"601" = Cpu{
502406 .name = "601",
503407 .llvm_name = "601",
504 .features = featureSet(&[_]Feature{
408 .features = featureSet(&all_features, &[_]Feature{
505409 .fpu,
506410 }),
507411 };
508412 pub const @"602" = Cpu{
509413 .name = "602",
510414 .llvm_name = "602",
511 .features = featureSet(&[_]Feature{
415 .features = featureSet(&all_features, &[_]Feature{
512416 .fpu,
513417 }),
514418 };
515419 pub const @"603" = Cpu{
516420 .name = "603",
517421 .llvm_name = "603",
518 .features = featureSet(&[_]Feature{
422 .features = featureSet(&all_features, &[_]Feature{
519423 .fres,
520424 .frsqrte,
521425 }),
......@@ -523,7 +427,7 @@ pub const cpu = struct {
523427 pub const @"603e" = Cpu{
524428 .name = "603e",
525429 .llvm_name = "603e",
526 .features = featureSet(&[_]Feature{
430 .features = featureSet(&all_features, &[_]Feature{
527431 .fres,
528432 .frsqrte,
529433 }),
......@@ -531,7 +435,7 @@ pub const cpu = struct {
531435 pub const @"603ev" = Cpu{
532436 .name = "603ev",
533437 .llvm_name = "603ev",
534 .features = featureSet(&[_]Feature{
438 .features = featureSet(&all_features, &[_]Feature{
535439 .fres,
536440 .frsqrte,
537441 }),
......@@ -539,7 +443,7 @@ pub const cpu = struct {
539443 pub const @"604" = Cpu{
540444 .name = "604",
541445 .llvm_name = "604",
542 .features = featureSet(&[_]Feature{
446 .features = featureSet(&all_features, &[_]Feature{
543447 .fres,
544448 .frsqrte,
545449 }),
......@@ -547,7 +451,7 @@ pub const cpu = struct {
547451 pub const @"604e" = Cpu{
548452 .name = "604e",
549453 .llvm_name = "604e",
550 .features = featureSet(&[_]Feature{
454 .features = featureSet(&all_features, &[_]Feature{
551455 .fres,
552456 .frsqrte,
553457 }),
......@@ -555,7 +459,7 @@ pub const cpu = struct {
555459 pub const @"620" = Cpu{
556460 .name = "620",
557461 .llvm_name = "620",
558 .features = featureSet(&[_]Feature{
462 .features = featureSet(&all_features, &[_]Feature{
559463 .fres,
560464 .frsqrte,
561465 }),
......@@ -563,7 +467,7 @@ pub const cpu = struct {
563467 pub const @"7400" = Cpu{
564468 .name = "7400",
565469 .llvm_name = "7400",
566 .features = featureSet(&[_]Feature{
470 .features = featureSet(&all_features, &[_]Feature{
567471 .altivec,
568472 .fres,
569473 .frsqrte,
......@@ -572,7 +476,7 @@ pub const cpu = struct {
572476 pub const @"7450" = Cpu{
573477 .name = "7450",
574478 .llvm_name = "7450",
575 .features = featureSet(&[_]Feature{
479 .features = featureSet(&all_features, &[_]Feature{
576480 .altivec,
577481 .fres,
578482 .frsqrte,
......@@ -581,7 +485,7 @@ pub const cpu = struct {
581485 pub const @"750" = Cpu{
582486 .name = "750",
583487 .llvm_name = "750",
584 .features = featureSet(&[_]Feature{
488 .features = featureSet(&all_features, &[_]Feature{
585489 .fres,
586490 .frsqrte,
587491 }),
......@@ -589,7 +493,7 @@ pub const cpu = struct {
589493 pub const @"970" = Cpu{
590494 .name = "970",
591495 .llvm_name = "970",
592 .features = featureSet(&[_]Feature{
496 .features = featureSet(&all_features, &[_]Feature{
593497 .@"64bit",
594498 .altivec,
595499 .fres,
......@@ -602,7 +506,7 @@ pub const cpu = struct {
602506 pub const a2 = Cpu{
603507 .name = "a2",
604508 .llvm_name = "a2",
605 .features = featureSet(&[_]Feature{
509 .features = featureSet(&all_features, &[_]Feature{
606510 .@"64bit",
607511 .booke,
608512 .cmpb,
......@@ -627,7 +531,7 @@ pub const cpu = struct {
627531 pub const a2q = Cpu{
628532 .name = "a2q",
629533 .llvm_name = "a2q",
630 .features = featureSet(&[_]Feature{
534 .features = featureSet(&all_features, &[_]Feature{
631535 .@"64bit",
632536 .booke,
633537 .cmpb,
......@@ -653,7 +557,7 @@ pub const cpu = struct {
653557 pub const e500 = Cpu{
654558 .name = "e500",
655559 .llvm_name = "e500",
656 .features = featureSet(&[_]Feature{
560 .features = featureSet(&all_features, &[_]Feature{
657561 .booke,
658562 .icbt,
659563 .isel,
......@@ -662,7 +566,7 @@ pub const cpu = struct {
662566 pub const e500mc = Cpu{
663567 .name = "e500mc",
664568 .llvm_name = "e500mc",
665 .features = featureSet(&[_]Feature{
569 .features = featureSet(&all_features, &[_]Feature{
666570 .booke,
667571 .icbt,
668572 .isel,
......@@ -672,7 +576,7 @@ pub const cpu = struct {
672576 pub const e5500 = Cpu{
673577 .name = "e5500",
674578 .llvm_name = "e5500",
675 .features = featureSet(&[_]Feature{
579 .features = featureSet(&all_features, &[_]Feature{
676580 .@"64bit",
677581 .booke,
678582 .icbt,
......@@ -684,7 +588,7 @@ pub const cpu = struct {
684588 pub const g3 = Cpu{
685589 .name = "g3",
686590 .llvm_name = "g3",
687 .features = featureSet(&[_]Feature{
591 .features = featureSet(&all_features, &[_]Feature{
688592 .fres,
689593 .frsqrte,
690594 }),
......@@ -692,7 +596,7 @@ pub const cpu = struct {
692596 pub const g4 = Cpu{
693597 .name = "g4",
694598 .llvm_name = "g4",
695 .features = featureSet(&[_]Feature{
599 .features = featureSet(&all_features, &[_]Feature{
696600 .altivec,
697601 .fres,
698602 .frsqrte,
......@@ -701,7 +605,7 @@ pub const cpu = struct {
701605 pub const @"g4+" = Cpu{
702606 .name = "g4+",
703607 .llvm_name = "g4+",
704 .features = featureSet(&[_]Feature{
608 .features = featureSet(&all_features, &[_]Feature{
705609 .altivec,
706610 .fres,
707611 .frsqrte,
......@@ -710,7 +614,7 @@ pub const cpu = struct {
710614 pub const g5 = Cpu{
711615 .name = "g5",
712616 .llvm_name = "g5",
713 .features = featureSet(&[_]Feature{
617 .features = featureSet(&all_features, &[_]Feature{
714618 .@"64bit",
715619 .altivec,
716620 .fres,
......@@ -723,28 +627,28 @@ pub const cpu = struct {
723627 pub const generic = Cpu{
724628 .name = "generic",
725629 .llvm_name = "generic",
726 .features = featureSet(&[_]Feature{
630 .features = featureSet(&all_features, &[_]Feature{
727631 .hard_float,
728632 }),
729633 };
730634 pub const ppc = Cpu{
731635 .name = "ppc",
732636 .llvm_name = "ppc",
733 .features = featureSet(&[_]Feature{
637 .features = featureSet(&all_features, &[_]Feature{
734638 .hard_float,
735639 }),
736640 };
737641 pub const ppc32 = Cpu{
738642 .name = "ppc32",
739643 .llvm_name = "ppc32",
740 .features = featureSet(&[_]Feature{
644 .features = featureSet(&all_features, &[_]Feature{
741645 .hard_float,
742646 }),
743647 };
744648 pub const ppc64 = Cpu{
745649 .name = "ppc64",
746650 .llvm_name = "ppc64",
747 .features = featureSet(&[_]Feature{
651 .features = featureSet(&all_features, &[_]Feature{
748652 .@"64bit",
749653 .altivec,
750654 .fres,
......@@ -757,7 +661,7 @@ pub const cpu = struct {
757661 pub const ppc64le = Cpu{
758662 .name = "ppc64le",
759663 .llvm_name = "ppc64le",
760 .features = featureSet(&[_]Feature{
664 .features = featureSet(&all_features, &[_]Feature{
761665 .@"64bit",
762666 .altivec,
763667 .bpermd,
......@@ -792,7 +696,7 @@ pub const cpu = struct {
792696 pub const pwr3 = Cpu{
793697 .name = "pwr3",
794698 .llvm_name = "pwr3",
795 .features = featureSet(&[_]Feature{
699 .features = featureSet(&all_features, &[_]Feature{
796700 .@"64bit",
797701 .altivec,
798702 .fres,
......@@ -804,7 +708,7 @@ pub const cpu = struct {
804708 pub const pwr4 = Cpu{
805709 .name = "pwr4",
806710 .llvm_name = "pwr4",
807 .features = featureSet(&[_]Feature{
711 .features = featureSet(&all_features, &[_]Feature{
808712 .@"64bit",
809713 .altivec,
810714 .fres,
......@@ -817,7 +721,7 @@ pub const cpu = struct {
817721 pub const pwr5 = Cpu{
818722 .name = "pwr5",
819723 .llvm_name = "pwr5",
820 .features = featureSet(&[_]Feature{
724 .features = featureSet(&all_features, &[_]Feature{
821725 .@"64bit",
822726 .altivec,
823727 .fre,
......@@ -832,7 +736,7 @@ pub const cpu = struct {
832736 pub const pwr5x = Cpu{
833737 .name = "pwr5x",
834738 .llvm_name = "pwr5x",
835 .features = featureSet(&[_]Feature{
739 .features = featureSet(&all_features, &[_]Feature{
836740 .@"64bit",
837741 .altivec,
838742 .fprnd,
......@@ -848,7 +752,7 @@ pub const cpu = struct {
848752 pub const pwr6 = Cpu{
849753 .name = "pwr6",
850754 .llvm_name = "pwr6",
851 .features = featureSet(&[_]Feature{
755 .features = featureSet(&all_features, &[_]Feature{
852756 .@"64bit",
853757 .altivec,
854758 .cmpb,
......@@ -868,7 +772,7 @@ pub const cpu = struct {
868772 pub const pwr6x = Cpu{
869773 .name = "pwr6x",
870774 .llvm_name = "pwr6x",
871 .features = featureSet(&[_]Feature{
775 .features = featureSet(&all_features, &[_]Feature{
872776 .@"64bit",
873777 .altivec,
874778 .cmpb,
......@@ -888,7 +792,7 @@ pub const cpu = struct {
888792 pub const pwr7 = Cpu{
889793 .name = "pwr7",
890794 .llvm_name = "pwr7",
891 .features = featureSet(&[_]Feature{
795 .features = featureSet(&all_features, &[_]Feature{
892796 .@"64bit",
893797 .altivec,
894798 .bpermd,
......@@ -916,7 +820,7 @@ pub const cpu = struct {
916820 pub const pwr8 = Cpu{
917821 .name = "pwr8",
918822 .llvm_name = "pwr8",
919 .features = featureSet(&[_]Feature{
823 .features = featureSet(&all_features, &[_]Feature{
920824 .@"64bit",
921825 .altivec,
922826 .bpermd,
......@@ -951,7 +855,7 @@ pub const cpu = struct {
951855 pub const pwr9 = Cpu{
952856 .name = "pwr9",
953857 .llvm_name = "pwr9",
954 .features = featureSet(&[_]Feature{
858 .features = featureSet(&all_features, &[_]Feature{
955859 .@"64bit",
956860 .altivec,
957861 .bpermd,
lib/std/target/riscv.zig+19-29
......@@ -16,66 +16,56 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
1616
1717pub const all_features = blk: {
1818 const len = @typeInfo(Feature).Enum.fields.len;
19 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
19 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
2020 var result: [len]Cpu.Feature = undefined;
2121 result[@enumToInt(Feature.@"64bit")] = .{
22 .index = @enumToInt(Feature.@"64bit"),
23 .name = @tagName(Feature.@"64bit"),
2422 .llvm_name = "64bit",
2523 .description = "Implements RV64",
26 .dependencies = featureSet(&[_]Feature{}),
24 .dependencies = sparseFeatureSet(&[_]Feature{}),
2725 };
2826 result[@enumToInt(Feature.a)] = .{
29 .index = @enumToInt(Feature.a),
30 .name = @tagName(Feature.a),
3127 .llvm_name = "a",
3228 .description = "'A' (Atomic Instructions)",
33 .dependencies = featureSet(&[_]Feature{}),
29 .dependencies = sparseFeatureSet(&[_]Feature{}),
3430 };
3531 result[@enumToInt(Feature.c)] = .{
36 .index = @enumToInt(Feature.c),
37 .name = @tagName(Feature.c),
3832 .llvm_name = "c",
3933 .description = "'C' (Compressed Instructions)",
40 .dependencies = featureSet(&[_]Feature{}),
34 .dependencies = sparseFeatureSet(&[_]Feature{}),
4135 };
4236 result[@enumToInt(Feature.d)] = .{
43 .index = @enumToInt(Feature.d),
44 .name = @tagName(Feature.d),
4537 .llvm_name = "d",
4638 .description = "'D' (Double-Precision Floating-Point)",
47 .dependencies = featureSet(&[_]Feature{
39 .dependencies = sparseFeatureSet(&[_]Feature{
4840 .f,
4941 }),
5042 };
5143 result[@enumToInt(Feature.e)] = .{
52 .index = @enumToInt(Feature.e),
53 .name = @tagName(Feature.e),
5444 .llvm_name = "e",
5545 .description = "Implements RV32E (provides 16 rather than 32 GPRs)",
56 .dependencies = featureSet(&[_]Feature{}),
46 .dependencies = sparseFeatureSet(&[_]Feature{}),
5747 };
5848 result[@enumToInt(Feature.f)] = .{
59 .index = @enumToInt(Feature.f),
60 .name = @tagName(Feature.f),
6149 .llvm_name = "f",
6250 .description = "'F' (Single-Precision Floating-Point)",
63 .dependencies = featureSet(&[_]Feature{}),
51 .dependencies = sparseFeatureSet(&[_]Feature{}),
6452 };
6553 result[@enumToInt(Feature.m)] = .{
66 .index = @enumToInt(Feature.m),
67 .name = @tagName(Feature.m),
6854 .llvm_name = "m",
6955 .description = "'M' (Integer Multiplication and Division)",
70 .dependencies = featureSet(&[_]Feature{}),
56 .dependencies = sparseFeatureSet(&[_]Feature{}),
7157 };
7258 result[@enumToInt(Feature.relax)] = .{
73 .index = @enumToInt(Feature.relax),
74 .name = @tagName(Feature.relax),
7559 .llvm_name = "relax",
7660 .description = "Enable Linker relaxation.",
77 .dependencies = featureSet(&[_]Feature{}),
61 .dependencies = sparseFeatureSet(&[_]Feature{}),
7862 };
63 const ti = @typeInfo(Feature);
64 for (result) |*elem, i| {
65 elem.index = i;
66 elem.name = ti.Enum.fields[i].name;
67 elem.dependencies.initAsDependencies(i, &result);
68 }
7969 break :blk result;
8070};
8171
......@@ -83,12 +73,12 @@ pub const cpu = struct {
8373 pub const generic_rv32 = Cpu{
8474 .name = "generic_rv32",
8575 .llvm_name = "generic-rv32",
86 .features = featureSet(&[_]Feature{}),
76 .features = featureSet(&all_features, &[_]Feature{}),
8777 };
8878 pub const generic_rv64 = Cpu{
8979 .name = "generic_rv64",
9080 .llvm_name = "generic-rv64",
91 .features = featureSet(&[_]Feature{
81 .features = featureSet(&all_features, &[_]Feature{
9282 .@"64bit",
9383 }),
9484 };
......@@ -102,7 +92,7 @@ pub const all_cpus = &[_]*const Cpu{
10292 &cpu.generic_rv64,
10393};
10494
105pub const baseline_32_features = featureSet(&[_]Feature{
95pub const baseline_32_features = featureSet(&all_features, &[_]Feature{
10696 .a,
10797 .c,
10898 .d,
......@@ -111,7 +101,7 @@ pub const baseline_32_features = featureSet(&[_]Feature{
111101 .relax,
112102});
113103
114pub const baseline_64_features = featureSet(&[_]Feature{
104pub const baseline_64_features = featureSet(&all_features, &[_]Feature{
115105 .@"64bit",
116106 .a,
117107 .c,
lib/std/target/sparc.zig+67-99
......@@ -27,141 +27,109 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
2727
2828pub const all_features = blk: {
2929 const len = @typeInfo(Feature).Enum.fields.len;
30 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
30 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
3131 var result: [len]Cpu.Feature = undefined;
3232 result[@enumToInt(Feature.deprecated_v8)] = .{
33 .index = @enumToInt(Feature.deprecated_v8),
34 .name = @tagName(Feature.deprecated_v8),
3533 .llvm_name = "deprecated-v8",
3634 .description = "Enable deprecated V8 instructions in V9 mode",
37 .dependencies = featureSet(&[_]Feature{}),
35 .dependencies = sparseFeatureSet(&[_]Feature{}),
3836 };
3937 result[@enumToInt(Feature.detectroundchange)] = .{
40 .index = @enumToInt(Feature.detectroundchange),
41 .name = @tagName(Feature.detectroundchange),
4238 .llvm_name = "detectroundchange",
4339 .description = "LEON3 erratum detection: Detects any rounding mode change request: use only the round-to-nearest rounding mode",
44 .dependencies = featureSet(&[_]Feature{}),
40 .dependencies = sparseFeatureSet(&[_]Feature{}),
4541 };
4642 result[@enumToInt(Feature.fixallfdivsqrt)] = .{
47 .index = @enumToInt(Feature.fixallfdivsqrt),
48 .name = @tagName(Feature.fixallfdivsqrt),
4943 .llvm_name = "fixallfdivsqrt",
5044 .description = "LEON erratum fix: Fix FDIVS/FDIVD/FSQRTS/FSQRTD instructions with NOPs and floating-point store",
51 .dependencies = featureSet(&[_]Feature{}),
45 .dependencies = sparseFeatureSet(&[_]Feature{}),
5246 };
5347 result[@enumToInt(Feature.hard_quad_float)] = .{
54 .index = @enumToInt(Feature.hard_quad_float),
55 .name = @tagName(Feature.hard_quad_float),
5648 .llvm_name = "hard-quad-float",
5749 .description = "Enable quad-word floating point instructions",
58 .dependencies = featureSet(&[_]Feature{}),
50 .dependencies = sparseFeatureSet(&[_]Feature{}),
5951 };
6052 result[@enumToInt(Feature.hasleoncasa)] = .{
61 .index = @enumToInt(Feature.hasleoncasa),
62 .name = @tagName(Feature.hasleoncasa),
6353 .llvm_name = "hasleoncasa",
6454 .description = "Enable CASA instruction for LEON3 and LEON4 processors",
65 .dependencies = featureSet(&[_]Feature{}),
55 .dependencies = sparseFeatureSet(&[_]Feature{}),
6656 };
6757 result[@enumToInt(Feature.hasumacsmac)] = .{
68 .index = @enumToInt(Feature.hasumacsmac),
69 .name = @tagName(Feature.hasumacsmac),
7058 .llvm_name = "hasumacsmac",
7159 .description = "Enable UMAC and SMAC for LEON3 and LEON4 processors",
72 .dependencies = featureSet(&[_]Feature{}),
60 .dependencies = sparseFeatureSet(&[_]Feature{}),
7361 };
7462 result[@enumToInt(Feature.insertnopload)] = .{
75 .index = @enumToInt(Feature.insertnopload),
76 .name = @tagName(Feature.insertnopload),
7763 .llvm_name = "insertnopload",
7864 .description = "LEON3 erratum fix: Insert a NOP instruction after every single-cycle load instruction when the next instruction is another load/store instruction",
79 .dependencies = featureSet(&[_]Feature{}),
65 .dependencies = sparseFeatureSet(&[_]Feature{}),
8066 };
8167 result[@enumToInt(Feature.leon)] = .{
82 .index = @enumToInt(Feature.leon),
83 .name = @tagName(Feature.leon),
8468 .llvm_name = "leon",
8569 .description = "Enable LEON extensions",
86 .dependencies = featureSet(&[_]Feature{}),
70 .dependencies = sparseFeatureSet(&[_]Feature{}),
8771 };
8872 result[@enumToInt(Feature.leoncyclecounter)] = .{
89 .index = @enumToInt(Feature.leoncyclecounter),
90 .name = @tagName(Feature.leoncyclecounter),
9173 .llvm_name = "leoncyclecounter",
9274 .description = "Use the Leon cycle counter register",
93 .dependencies = featureSet(&[_]Feature{}),
75 .dependencies = sparseFeatureSet(&[_]Feature{}),
9476 };
9577 result[@enumToInt(Feature.leonpwrpsr)] = .{
96 .index = @enumToInt(Feature.leonpwrpsr),
97 .name = @tagName(Feature.leonpwrpsr),
9878 .llvm_name = "leonpwrpsr",
9979 .description = "Enable the PWRPSR instruction",
100 .dependencies = featureSet(&[_]Feature{}),
80 .dependencies = sparseFeatureSet(&[_]Feature{}),
10181 };
10282 result[@enumToInt(Feature.no_fmuls)] = .{
103 .index = @enumToInt(Feature.no_fmuls),
104 .name = @tagName(Feature.no_fmuls),
10583 .llvm_name = "no-fmuls",
10684 .description = "Disable the fmuls instruction.",
107 .dependencies = featureSet(&[_]Feature{}),
85 .dependencies = sparseFeatureSet(&[_]Feature{}),
10886 };
10987 result[@enumToInt(Feature.no_fsmuld)] = .{
110 .index = @enumToInt(Feature.no_fsmuld),
111 .name = @tagName(Feature.no_fsmuld),
11288 .llvm_name = "no-fsmuld",
11389 .description = "Disable the fsmuld instruction.",
114 .dependencies = featureSet(&[_]Feature{}),
90 .dependencies = sparseFeatureSet(&[_]Feature{}),
11591 };
11692 result[@enumToInt(Feature.popc)] = .{
117 .index = @enumToInt(Feature.popc),
118 .name = @tagName(Feature.popc),
11993 .llvm_name = "popc",
12094 .description = "Use the popc (population count) instruction",
121 .dependencies = featureSet(&[_]Feature{}),
95 .dependencies = sparseFeatureSet(&[_]Feature{}),
12296 };
12397 result[@enumToInt(Feature.soft_float)] = .{
124 .index = @enumToInt(Feature.soft_float),
125 .name = @tagName(Feature.soft_float),
12698 .llvm_name = "soft-float",
12799 .description = "Use software emulation for floating point",
128 .dependencies = featureSet(&[_]Feature{}),
100 .dependencies = sparseFeatureSet(&[_]Feature{}),
129101 };
130102 result[@enumToInt(Feature.soft_mul_div)] = .{
131 .index = @enumToInt(Feature.soft_mul_div),
132 .name = @tagName(Feature.soft_mul_div),
133103 .llvm_name = "soft-mul-div",
134104 .description = "Use software emulation for integer multiply and divide",
135 .dependencies = featureSet(&[_]Feature{}),
105 .dependencies = sparseFeatureSet(&[_]Feature{}),
136106 };
137107 result[@enumToInt(Feature.v9)] = .{
138 .index = @enumToInt(Feature.v9),
139 .name = @tagName(Feature.v9),
140108 .llvm_name = "v9",
141109 .description = "Enable SPARC-V9 instructions",
142 .dependencies = featureSet(&[_]Feature{}),
110 .dependencies = sparseFeatureSet(&[_]Feature{}),
143111 };
144112 result[@enumToInt(Feature.vis)] = .{
145 .index = @enumToInt(Feature.vis),
146 .name = @tagName(Feature.vis),
147113 .llvm_name = "vis",
148114 .description = "Enable UltraSPARC Visual Instruction Set extensions",
149 .dependencies = featureSet(&[_]Feature{}),
115 .dependencies = sparseFeatureSet(&[_]Feature{}),
150116 };
151117 result[@enumToInt(Feature.vis2)] = .{
152 .index = @enumToInt(Feature.vis2),
153 .name = @tagName(Feature.vis2),
154118 .llvm_name = "vis2",
155119 .description = "Enable Visual Instruction Set extensions II",
156 .dependencies = featureSet(&[_]Feature{}),
120 .dependencies = sparseFeatureSet(&[_]Feature{}),
157121 };
158122 result[@enumToInt(Feature.vis3)] = .{
159 .index = @enumToInt(Feature.vis3),
160 .name = @tagName(Feature.vis3),
161123 .llvm_name = "vis3",
162124 .description = "Enable Visual Instruction Set extensions III",
163 .dependencies = featureSet(&[_]Feature{}),
164 };
125 .dependencies = sparseFeatureSet(&[_]Feature{}),
126 };
127 const ti = @typeInfo(Feature);
128 for (result) |*elem, i| {
129 elem.index = i;
130 elem.name = ti.Enum.fields[i].name;
131 elem.dependencies.initAsDependencies(i, &result);
132 }
165133 break :blk result;
166134};
167135
......@@ -169,7 +137,7 @@ pub const cpu = struct {
169137 pub const at697e = Cpu{
170138 .name = "at697e",
171139 .llvm_name = "at697e",
172 .features = featureSet(&[_]Feature{
140 .features = featureSet(&all_features, &[_]Feature{
173141 .insertnopload,
174142 .leon,
175143 }),
......@@ -177,7 +145,7 @@ pub const cpu = struct {
177145 pub const at697f = Cpu{
178146 .name = "at697f",
179147 .llvm_name = "at697f",
180 .features = featureSet(&[_]Feature{
148 .features = featureSet(&all_features, &[_]Feature{
181149 .insertnopload,
182150 .leon,
183151 }),
......@@ -185,17 +153,17 @@ pub const cpu = struct {
185153 pub const f934 = Cpu{
186154 .name = "f934",
187155 .llvm_name = "f934",
188 .features = featureSet(&[_]Feature{}),
156 .features = featureSet(&all_features, &[_]Feature{}),
189157 };
190158 pub const generic = Cpu{
191159 .name = "generic",
192160 .llvm_name = "generic",
193 .features = featureSet(&[_]Feature{}),
161 .features = featureSet(&all_features, &[_]Feature{}),
194162 };
195163 pub const gr712rc = Cpu{
196164 .name = "gr712rc",
197165 .llvm_name = "gr712rc",
198 .features = featureSet(&[_]Feature{
166 .features = featureSet(&all_features, &[_]Feature{
199167 .hasleoncasa,
200168 .leon,
201169 }),
......@@ -203,7 +171,7 @@ pub const cpu = struct {
203171 pub const gr740 = Cpu{
204172 .name = "gr740",
205173 .llvm_name = "gr740",
206 .features = featureSet(&[_]Feature{
174 .features = featureSet(&all_features, &[_]Feature{
207175 .hasleoncasa,
208176 .hasumacsmac,
209177 .leon,
......@@ -214,19 +182,19 @@ pub const cpu = struct {
214182 pub const hypersparc = Cpu{
215183 .name = "hypersparc",
216184 .llvm_name = "hypersparc",
217 .features = featureSet(&[_]Feature{}),
185 .features = featureSet(&all_features, &[_]Feature{}),
218186 };
219187 pub const leon2 = Cpu{
220188 .name = "leon2",
221189 .llvm_name = "leon2",
222 .features = featureSet(&[_]Feature{
190 .features = featureSet(&all_features, &[_]Feature{
223191 .leon,
224192 }),
225193 };
226194 pub const leon3 = Cpu{
227195 .name = "leon3",
228196 .llvm_name = "leon3",
229 .features = featureSet(&[_]Feature{
197 .features = featureSet(&all_features, &[_]Feature{
230198 .hasumacsmac,
231199 .leon,
232200 }),
......@@ -234,7 +202,7 @@ pub const cpu = struct {
234202 pub const leon4 = Cpu{
235203 .name = "leon4",
236204 .llvm_name = "leon4",
237 .features = featureSet(&[_]Feature{
205 .features = featureSet(&all_features, &[_]Feature{
238206 .hasleoncasa,
239207 .hasumacsmac,
240208 .leon,
......@@ -243,7 +211,7 @@ pub const cpu = struct {
243211 pub const ma2080 = Cpu{
244212 .name = "ma2080",
245213 .llvm_name = "ma2080",
246 .features = featureSet(&[_]Feature{
214 .features = featureSet(&all_features, &[_]Feature{
247215 .hasleoncasa,
248216 .leon,
249217 }),
......@@ -251,7 +219,7 @@ pub const cpu = struct {
251219 pub const ma2085 = Cpu{
252220 .name = "ma2085",
253221 .llvm_name = "ma2085",
254 .features = featureSet(&[_]Feature{
222 .features = featureSet(&all_features, &[_]Feature{
255223 .hasleoncasa,
256224 .leon,
257225 }),
......@@ -259,7 +227,7 @@ pub const cpu = struct {
259227 pub const ma2100 = Cpu{
260228 .name = "ma2100",
261229 .llvm_name = "ma2100",
262 .features = featureSet(&[_]Feature{
230 .features = featureSet(&all_features, &[_]Feature{
263231 .hasleoncasa,
264232 .leon,
265233 }),
......@@ -267,7 +235,7 @@ pub const cpu = struct {
267235 pub const ma2150 = Cpu{
268236 .name = "ma2150",
269237 .llvm_name = "ma2150",
270 .features = featureSet(&[_]Feature{
238 .features = featureSet(&all_features, &[_]Feature{
271239 .hasleoncasa,
272240 .leon,
273241 }),
......@@ -275,7 +243,7 @@ pub const cpu = struct {
275243 pub const ma2155 = Cpu{
276244 .name = "ma2155",
277245 .llvm_name = "ma2155",
278 .features = featureSet(&[_]Feature{
246 .features = featureSet(&all_features, &[_]Feature{
279247 .hasleoncasa,
280248 .leon,
281249 }),
......@@ -283,7 +251,7 @@ pub const cpu = struct {
283251 pub const ma2450 = Cpu{
284252 .name = "ma2450",
285253 .llvm_name = "ma2450",
286 .features = featureSet(&[_]Feature{
254 .features = featureSet(&all_features, &[_]Feature{
287255 .hasleoncasa,
288256 .leon,
289257 }),
......@@ -291,7 +259,7 @@ pub const cpu = struct {
291259 pub const ma2455 = Cpu{
292260 .name = "ma2455",
293261 .llvm_name = "ma2455",
294 .features = featureSet(&[_]Feature{
262 .features = featureSet(&all_features, &[_]Feature{
295263 .hasleoncasa,
296264 .leon,
297265 }),
......@@ -299,7 +267,7 @@ pub const cpu = struct {
299267 pub const ma2480 = Cpu{
300268 .name = "ma2480",
301269 .llvm_name = "ma2480",
302 .features = featureSet(&[_]Feature{
270 .features = featureSet(&all_features, &[_]Feature{
303271 .hasleoncasa,
304272 .leon,
305273 }),
......@@ -307,7 +275,7 @@ pub const cpu = struct {
307275 pub const ma2485 = Cpu{
308276 .name = "ma2485",
309277 .llvm_name = "ma2485",
310 .features = featureSet(&[_]Feature{
278 .features = featureSet(&all_features, &[_]Feature{
311279 .hasleoncasa,
312280 .leon,
313281 }),
......@@ -315,7 +283,7 @@ pub const cpu = struct {
315283 pub const ma2x5x = Cpu{
316284 .name = "ma2x5x",
317285 .llvm_name = "ma2x5x",
318 .features = featureSet(&[_]Feature{
286 .features = featureSet(&all_features, &[_]Feature{
319287 .hasleoncasa,
320288 .leon,
321289 }),
......@@ -323,7 +291,7 @@ pub const cpu = struct {
323291 pub const ma2x8x = Cpu{
324292 .name = "ma2x8x",
325293 .llvm_name = "ma2x8x",
326 .features = featureSet(&[_]Feature{
294 .features = featureSet(&all_features, &[_]Feature{
327295 .hasleoncasa,
328296 .leon,
329297 }),
......@@ -331,7 +299,7 @@ pub const cpu = struct {
331299 pub const myriad2 = Cpu{
332300 .name = "myriad2",
333301 .llvm_name = "myriad2",
334 .features = featureSet(&[_]Feature{
302 .features = featureSet(&all_features, &[_]Feature{
335303 .hasleoncasa,
336304 .leon,
337305 }),
......@@ -339,7 +307,7 @@ pub const cpu = struct {
339307 pub const myriad2_1 = Cpu{
340308 .name = "myriad2_1",
341309 .llvm_name = "myriad2.1",
342 .features = featureSet(&[_]Feature{
310 .features = featureSet(&all_features, &[_]Feature{
343311 .hasleoncasa,
344312 .leon,
345313 }),
......@@ -347,7 +315,7 @@ pub const cpu = struct {
347315 pub const myriad2_2 = Cpu{
348316 .name = "myriad2_2",
349317 .llvm_name = "myriad2.2",
350 .features = featureSet(&[_]Feature{
318 .features = featureSet(&all_features, &[_]Feature{
351319 .hasleoncasa,
352320 .leon,
353321 }),
......@@ -355,7 +323,7 @@ pub const cpu = struct {
355323 pub const myriad2_3 = Cpu{
356324 .name = "myriad2_3",
357325 .llvm_name = "myriad2.3",
358 .features = featureSet(&[_]Feature{
326 .features = featureSet(&all_features, &[_]Feature{
359327 .hasleoncasa,
360328 .leon,
361329 }),
......@@ -363,7 +331,7 @@ pub const cpu = struct {
363331 pub const niagara = Cpu{
364332 .name = "niagara",
365333 .llvm_name = "niagara",
366 .features = featureSet(&[_]Feature{
334 .features = featureSet(&all_features, &[_]Feature{
367335 .deprecated_v8,
368336 .v9,
369337 .vis,
......@@ -373,7 +341,7 @@ pub const cpu = struct {
373341 pub const niagara2 = Cpu{
374342 .name = "niagara2",
375343 .llvm_name = "niagara2",
376 .features = featureSet(&[_]Feature{
344 .features = featureSet(&all_features, &[_]Feature{
377345 .deprecated_v8,
378346 .popc,
379347 .v9,
......@@ -384,7 +352,7 @@ pub const cpu = struct {
384352 pub const niagara3 = Cpu{
385353 .name = "niagara3",
386354 .llvm_name = "niagara3",
387 .features = featureSet(&[_]Feature{
355 .features = featureSet(&all_features, &[_]Feature{
388356 .deprecated_v8,
389357 .popc,
390358 .v9,
......@@ -395,7 +363,7 @@ pub const cpu = struct {
395363 pub const niagara4 = Cpu{
396364 .name = "niagara4",
397365 .llvm_name = "niagara4",
398 .features = featureSet(&[_]Feature{
366 .features = featureSet(&all_features, &[_]Feature{
399367 .deprecated_v8,
400368 .popc,
401369 .v9,
......@@ -407,32 +375,32 @@ pub const cpu = struct {
407375 pub const sparclet = Cpu{
408376 .name = "sparclet",
409377 .llvm_name = "sparclet",
410 .features = featureSet(&[_]Feature{}),
378 .features = featureSet(&all_features, &[_]Feature{}),
411379 };
412380 pub const sparclite = Cpu{
413381 .name = "sparclite",
414382 .llvm_name = "sparclite",
415 .features = featureSet(&[_]Feature{}),
383 .features = featureSet(&all_features, &[_]Feature{}),
416384 };
417385 pub const sparclite86x = Cpu{
418386 .name = "sparclite86x",
419387 .llvm_name = "sparclite86x",
420 .features = featureSet(&[_]Feature{}),
388 .features = featureSet(&all_features, &[_]Feature{}),
421389 };
422390 pub const supersparc = Cpu{
423391 .name = "supersparc",
424392 .llvm_name = "supersparc",
425 .features = featureSet(&[_]Feature{}),
393 .features = featureSet(&all_features, &[_]Feature{}),
426394 };
427395 pub const tsc701 = Cpu{
428396 .name = "tsc701",
429397 .llvm_name = "tsc701",
430 .features = featureSet(&[_]Feature{}),
398 .features = featureSet(&all_features, &[_]Feature{}),
431399 };
432400 pub const ultrasparc = Cpu{
433401 .name = "ultrasparc",
434402 .llvm_name = "ultrasparc",
435 .features = featureSet(&[_]Feature{
403 .features = featureSet(&all_features, &[_]Feature{
436404 .deprecated_v8,
437405 .v9,
438406 .vis,
......@@ -441,7 +409,7 @@ pub const cpu = struct {
441409 pub const ultrasparc3 = Cpu{
442410 .name = "ultrasparc3",
443411 .llvm_name = "ultrasparc3",
444 .features = featureSet(&[_]Feature{
412 .features = featureSet(&all_features, &[_]Feature{
445413 .deprecated_v8,
446414 .v9,
447415 .vis,
......@@ -451,7 +419,7 @@ pub const cpu = struct {
451419 pub const ut699 = Cpu{
452420 .name = "ut699",
453421 .llvm_name = "ut699",
454 .features = featureSet(&[_]Feature{
422 .features = featureSet(&all_features, &[_]Feature{
455423 .fixallfdivsqrt,
456424 .insertnopload,
457425 .leon,
......@@ -462,7 +430,7 @@ pub const cpu = struct {
462430 pub const v7 = Cpu{
463431 .name = "v7",
464432 .llvm_name = "v7",
465 .features = featureSet(&[_]Feature{
433 .features = featureSet(&all_features, &[_]Feature{
466434 .no_fsmuld,
467435 .soft_mul_div,
468436 }),
......@@ -470,12 +438,12 @@ pub const cpu = struct {
470438 pub const v8 = Cpu{
471439 .name = "v8",
472440 .llvm_name = "v8",
473 .features = featureSet(&[_]Feature{}),
441 .features = featureSet(&all_features, &[_]Feature{}),
474442 };
475443 pub const v9 = Cpu{
476444 .name = "v9",
477445 .llvm_name = "v9",
478 .features = featureSet(&[_]Feature{
446 .features = featureSet(&all_features, &[_]Feature{
479447 .v9,
480448 }),
481449 };
lib/std/target/systemz.zig+55-119
......@@ -43,253 +43,189 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
4343
4444pub const all_features = blk: {
4545 const len = @typeInfo(Feature).Enum.fields.len;
46 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
46 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
4747 var result: [len]Cpu.Feature = undefined;
4848 result[@enumToInt(Feature.deflate_conversion)] = .{
49 .index = @enumToInt(Feature.deflate_conversion),
50 .name = @tagName(Feature.deflate_conversion),
5149 .llvm_name = "deflate-conversion",
5250 .description = "Assume that the deflate-conversion facility is installed",
53 .dependencies = featureSet(&[_]Feature{}),
51 .dependencies = sparseFeatureSet(&[_]Feature{}),
5452 };
5553 result[@enumToInt(Feature.dfp_packed_conversion)] = .{
56 .index = @enumToInt(Feature.dfp_packed_conversion),
57 .name = @tagName(Feature.dfp_packed_conversion),
5854 .llvm_name = "dfp-packed-conversion",
5955 .description = "Assume that the DFP packed-conversion facility is installed",
60 .dependencies = featureSet(&[_]Feature{}),
56 .dependencies = sparseFeatureSet(&[_]Feature{}),
6157 };
6258 result[@enumToInt(Feature.dfp_zoned_conversion)] = .{
63 .index = @enumToInt(Feature.dfp_zoned_conversion),
64 .name = @tagName(Feature.dfp_zoned_conversion),
6559 .llvm_name = "dfp-zoned-conversion",
6660 .description = "Assume that the DFP zoned-conversion facility is installed",
67 .dependencies = featureSet(&[_]Feature{}),
61 .dependencies = sparseFeatureSet(&[_]Feature{}),
6862 };
6963 result[@enumToInt(Feature.distinct_ops)] = .{
70 .index = @enumToInt(Feature.distinct_ops),
71 .name = @tagName(Feature.distinct_ops),
7264 .llvm_name = "distinct-ops",
7365 .description = "Assume that the distinct-operands facility is installed",
74 .dependencies = featureSet(&[_]Feature{}),
66 .dependencies = sparseFeatureSet(&[_]Feature{}),
7567 };
7668 result[@enumToInt(Feature.enhanced_dat_2)] = .{
77 .index = @enumToInt(Feature.enhanced_dat_2),
78 .name = @tagName(Feature.enhanced_dat_2),
7969 .llvm_name = "enhanced-dat-2",
8070 .description = "Assume that the enhanced-DAT facility 2 is installed",
81 .dependencies = featureSet(&[_]Feature{}),
71 .dependencies = sparseFeatureSet(&[_]Feature{}),
8272 };
8373 result[@enumToInt(Feature.enhanced_sort)] = .{
84 .index = @enumToInt(Feature.enhanced_sort),
85 .name = @tagName(Feature.enhanced_sort),
8674 .llvm_name = "enhanced-sort",
8775 .description = "Assume that the enhanced-sort facility is installed",
88 .dependencies = featureSet(&[_]Feature{}),
76 .dependencies = sparseFeatureSet(&[_]Feature{}),
8977 };
9078 result[@enumToInt(Feature.execution_hint)] = .{
91 .index = @enumToInt(Feature.execution_hint),
92 .name = @tagName(Feature.execution_hint),
9379 .llvm_name = "execution-hint",
9480 .description = "Assume that the execution-hint facility is installed",
95 .dependencies = featureSet(&[_]Feature{}),
81 .dependencies = sparseFeatureSet(&[_]Feature{}),
9682 };
9783 result[@enumToInt(Feature.fast_serialization)] = .{
98 .index = @enumToInt(Feature.fast_serialization),
99 .name = @tagName(Feature.fast_serialization),
10084 .llvm_name = "fast-serialization",
10185 .description = "Assume that the fast-serialization facility is installed",
102 .dependencies = featureSet(&[_]Feature{}),
86 .dependencies = sparseFeatureSet(&[_]Feature{}),
10387 };
10488 result[@enumToInt(Feature.fp_extension)] = .{
105 .index = @enumToInt(Feature.fp_extension),
106 .name = @tagName(Feature.fp_extension),
10789 .llvm_name = "fp-extension",
10890 .description = "Assume that the floating-point extension facility is installed",
109 .dependencies = featureSet(&[_]Feature{}),
91 .dependencies = sparseFeatureSet(&[_]Feature{}),
11092 };
11193 result[@enumToInt(Feature.guarded_storage)] = .{
112 .index = @enumToInt(Feature.guarded_storage),
113 .name = @tagName(Feature.guarded_storage),
11494 .llvm_name = "guarded-storage",
11595 .description = "Assume that the guarded-storage facility is installed",
116 .dependencies = featureSet(&[_]Feature{}),
96 .dependencies = sparseFeatureSet(&[_]Feature{}),
11797 };
11898 result[@enumToInt(Feature.high_word)] = .{
119 .index = @enumToInt(Feature.high_word),
120 .name = @tagName(Feature.high_word),
12199 .llvm_name = "high-word",
122100 .description = "Assume that the high-word facility is installed",
123 .dependencies = featureSet(&[_]Feature{}),
101 .dependencies = sparseFeatureSet(&[_]Feature{}),
124102 };
125103 result[@enumToInt(Feature.insert_reference_bits_multiple)] = .{
126 .index = @enumToInt(Feature.insert_reference_bits_multiple),
127 .name = @tagName(Feature.insert_reference_bits_multiple),
128104 .llvm_name = "insert-reference-bits-multiple",
129105 .description = "Assume that the insert-reference-bits-multiple facility is installed",
130 .dependencies = featureSet(&[_]Feature{}),
106 .dependencies = sparseFeatureSet(&[_]Feature{}),
131107 };
132108 result[@enumToInt(Feature.interlocked_access1)] = .{
133 .index = @enumToInt(Feature.interlocked_access1),
134 .name = @tagName(Feature.interlocked_access1),
135109 .llvm_name = "interlocked-access1",
136110 .description = "Assume that interlocked-access facility 1 is installed",
137 .dependencies = featureSet(&[_]Feature{}),
111 .dependencies = sparseFeatureSet(&[_]Feature{}),
138112 };
139113 result[@enumToInt(Feature.load_and_trap)] = .{
140 .index = @enumToInt(Feature.load_and_trap),
141 .name = @tagName(Feature.load_and_trap),
142114 .llvm_name = "load-and-trap",
143115 .description = "Assume that the load-and-trap facility is installed",
144 .dependencies = featureSet(&[_]Feature{}),
116 .dependencies = sparseFeatureSet(&[_]Feature{}),
145117 };
146118 result[@enumToInt(Feature.load_and_zero_rightmost_byte)] = .{
147 .index = @enumToInt(Feature.load_and_zero_rightmost_byte),
148 .name = @tagName(Feature.load_and_zero_rightmost_byte),
149119 .llvm_name = "load-and-zero-rightmost-byte",
150120 .description = "Assume that the load-and-zero-rightmost-byte facility is installed",
151 .dependencies = featureSet(&[_]Feature{}),
121 .dependencies = sparseFeatureSet(&[_]Feature{}),
152122 };
153123 result[@enumToInt(Feature.load_store_on_cond)] = .{
154 .index = @enumToInt(Feature.load_store_on_cond),
155 .name = @tagName(Feature.load_store_on_cond),
156124 .llvm_name = "load-store-on-cond",
157125 .description = "Assume that the load/store-on-condition facility is installed",
158 .dependencies = featureSet(&[_]Feature{}),
126 .dependencies = sparseFeatureSet(&[_]Feature{}),
159127 };
160128 result[@enumToInt(Feature.load_store_on_cond_2)] = .{
161 .index = @enumToInt(Feature.load_store_on_cond_2),
162 .name = @tagName(Feature.load_store_on_cond_2),
163129 .llvm_name = "load-store-on-cond-2",
164130 .description = "Assume that the load/store-on-condition facility 2 is installed",
165 .dependencies = featureSet(&[_]Feature{}),
131 .dependencies = sparseFeatureSet(&[_]Feature{}),
166132 };
167133 result[@enumToInt(Feature.message_security_assist_extension3)] = .{
168 .index = @enumToInt(Feature.message_security_assist_extension3),
169 .name = @tagName(Feature.message_security_assist_extension3),
170134 .llvm_name = "message-security-assist-extension3",
171135 .description = "Assume that the message-security-assist extension facility 3 is installed",
172 .dependencies = featureSet(&[_]Feature{}),
136 .dependencies = sparseFeatureSet(&[_]Feature{}),
173137 };
174138 result[@enumToInt(Feature.message_security_assist_extension4)] = .{
175 .index = @enumToInt(Feature.message_security_assist_extension4),
176 .name = @tagName(Feature.message_security_assist_extension4),
177139 .llvm_name = "message-security-assist-extension4",
178140 .description = "Assume that the message-security-assist extension facility 4 is installed",
179 .dependencies = featureSet(&[_]Feature{}),
141 .dependencies = sparseFeatureSet(&[_]Feature{}),
180142 };
181143 result[@enumToInt(Feature.message_security_assist_extension5)] = .{
182 .index = @enumToInt(Feature.message_security_assist_extension5),
183 .name = @tagName(Feature.message_security_assist_extension5),
184144 .llvm_name = "message-security-assist-extension5",
185145 .description = "Assume that the message-security-assist extension facility 5 is installed",
186 .dependencies = featureSet(&[_]Feature{}),
146 .dependencies = sparseFeatureSet(&[_]Feature{}),
187147 };
188148 result[@enumToInt(Feature.message_security_assist_extension7)] = .{
189 .index = @enumToInt(Feature.message_security_assist_extension7),
190 .name = @tagName(Feature.message_security_assist_extension7),
191149 .llvm_name = "message-security-assist-extension7",
192150 .description = "Assume that the message-security-assist extension facility 7 is installed",
193 .dependencies = featureSet(&[_]Feature{}),
151 .dependencies = sparseFeatureSet(&[_]Feature{}),
194152 };
195153 result[@enumToInt(Feature.message_security_assist_extension8)] = .{
196 .index = @enumToInt(Feature.message_security_assist_extension8),
197 .name = @tagName(Feature.message_security_assist_extension8),
198154 .llvm_name = "message-security-assist-extension8",
199155 .description = "Assume that the message-security-assist extension facility 8 is installed",
200 .dependencies = featureSet(&[_]Feature{}),
156 .dependencies = sparseFeatureSet(&[_]Feature{}),
201157 };
202158 result[@enumToInt(Feature.message_security_assist_extension9)] = .{
203 .index = @enumToInt(Feature.message_security_assist_extension9),
204 .name = @tagName(Feature.message_security_assist_extension9),
205159 .llvm_name = "message-security-assist-extension9",
206160 .description = "Assume that the message-security-assist extension facility 9 is installed",
207 .dependencies = featureSet(&[_]Feature{}),
161 .dependencies = sparseFeatureSet(&[_]Feature{}),
208162 };
209163 result[@enumToInt(Feature.miscellaneous_extensions)] = .{
210 .index = @enumToInt(Feature.miscellaneous_extensions),
211 .name = @tagName(Feature.miscellaneous_extensions),
212164 .llvm_name = "miscellaneous-extensions",
213165 .description = "Assume that the miscellaneous-extensions facility is installed",
214 .dependencies = featureSet(&[_]Feature{}),
166 .dependencies = sparseFeatureSet(&[_]Feature{}),
215167 };
216168 result[@enumToInt(Feature.miscellaneous_extensions_2)] = .{
217 .index = @enumToInt(Feature.miscellaneous_extensions_2),
218 .name = @tagName(Feature.miscellaneous_extensions_2),
219169 .llvm_name = "miscellaneous-extensions-2",
220170 .description = "Assume that the miscellaneous-extensions facility 2 is installed",
221 .dependencies = featureSet(&[_]Feature{}),
171 .dependencies = sparseFeatureSet(&[_]Feature{}),
222172 };
223173 result[@enumToInt(Feature.miscellaneous_extensions_3)] = .{
224 .index = @enumToInt(Feature.miscellaneous_extensions_3),
225 .name = @tagName(Feature.miscellaneous_extensions_3),
226174 .llvm_name = "miscellaneous-extensions-3",
227175 .description = "Assume that the miscellaneous-extensions facility 3 is installed",
228 .dependencies = featureSet(&[_]Feature{}),
176 .dependencies = sparseFeatureSet(&[_]Feature{}),
229177 };
230178 result[@enumToInt(Feature.population_count)] = .{
231 .index = @enumToInt(Feature.population_count),
232 .name = @tagName(Feature.population_count),
233179 .llvm_name = "population-count",
234180 .description = "Assume that the population-count facility is installed",
235 .dependencies = featureSet(&[_]Feature{}),
181 .dependencies = sparseFeatureSet(&[_]Feature{}),
236182 };
237183 result[@enumToInt(Feature.processor_assist)] = .{
238 .index = @enumToInt(Feature.processor_assist),
239 .name = @tagName(Feature.processor_assist),
240184 .llvm_name = "processor-assist",
241185 .description = "Assume that the processor-assist facility is installed",
242 .dependencies = featureSet(&[_]Feature{}),
186 .dependencies = sparseFeatureSet(&[_]Feature{}),
243187 };
244188 result[@enumToInt(Feature.reset_reference_bits_multiple)] = .{
245 .index = @enumToInt(Feature.reset_reference_bits_multiple),
246 .name = @tagName(Feature.reset_reference_bits_multiple),
247189 .llvm_name = "reset-reference-bits-multiple",
248190 .description = "Assume that the reset-reference-bits-multiple facility is installed",
249 .dependencies = featureSet(&[_]Feature{}),
191 .dependencies = sparseFeatureSet(&[_]Feature{}),
250192 };
251193 result[@enumToInt(Feature.transactional_execution)] = .{
252 .index = @enumToInt(Feature.transactional_execution),
253 .name = @tagName(Feature.transactional_execution),
254194 .llvm_name = "transactional-execution",
255195 .description = "Assume that the transactional-execution facility is installed",
256 .dependencies = featureSet(&[_]Feature{}),
196 .dependencies = sparseFeatureSet(&[_]Feature{}),
257197 };
258198 result[@enumToInt(Feature.vector)] = .{
259 .index = @enumToInt(Feature.vector),
260 .name = @tagName(Feature.vector),
261199 .llvm_name = "vector",
262200 .description = "Assume that the vectory facility is installed",
263 .dependencies = featureSet(&[_]Feature{}),
201 .dependencies = sparseFeatureSet(&[_]Feature{}),
264202 };
265203 result[@enumToInt(Feature.vector_enhancements_1)] = .{
266 .index = @enumToInt(Feature.vector_enhancements_1),
267 .name = @tagName(Feature.vector_enhancements_1),
268204 .llvm_name = "vector-enhancements-1",
269205 .description = "Assume that the vector enhancements facility 1 is installed",
270 .dependencies = featureSet(&[_]Feature{}),
206 .dependencies = sparseFeatureSet(&[_]Feature{}),
271207 };
272208 result[@enumToInt(Feature.vector_enhancements_2)] = .{
273 .index = @enumToInt(Feature.vector_enhancements_2),
274 .name = @tagName(Feature.vector_enhancements_2),
275209 .llvm_name = "vector-enhancements-2",
276210 .description = "Assume that the vector enhancements facility 2 is installed",
277 .dependencies = featureSet(&[_]Feature{}),
211 .dependencies = sparseFeatureSet(&[_]Feature{}),
278212 };
279213 result[@enumToInt(Feature.vector_packed_decimal)] = .{
280 .index = @enumToInt(Feature.vector_packed_decimal),
281 .name = @tagName(Feature.vector_packed_decimal),
282214 .llvm_name = "vector-packed-decimal",
283215 .description = "Assume that the vector packed decimal facility is installed",
284 .dependencies = featureSet(&[_]Feature{}),
216 .dependencies = sparseFeatureSet(&[_]Feature{}),
285217 };
286218 result[@enumToInt(Feature.vector_packed_decimal_enhancement)] = .{
287 .index = @enumToInt(Feature.vector_packed_decimal_enhancement),
288 .name = @tagName(Feature.vector_packed_decimal_enhancement),
289219 .llvm_name = "vector-packed-decimal-enhancement",
290220 .description = "Assume that the vector packed decimal enhancement facility is installed",
291 .dependencies = featureSet(&[_]Feature{}),
292 };
221 .dependencies = sparseFeatureSet(&[_]Feature{}),
222 };
223 const ti = @typeInfo(Feature);
224 for (result) |*elem, i| {
225 elem.index = i;
226 elem.name = ti.Enum.fields[i].name;
227 elem.dependencies.initAsDependencies(i, &result);
228 }
293229 break :blk result;
294230};
295231
......@@ -297,7 +233,7 @@ pub const cpu = struct {
297233 pub const arch10 = Cpu{
298234 .name = "arch10",
299235 .llvm_name = "arch10",
300 .features = featureSet(&[_]Feature{
236 .features = featureSet(&all_features, &[_]Feature{
301237 .dfp_zoned_conversion,
302238 .distinct_ops,
303239 .enhanced_dat_2,
......@@ -320,7 +256,7 @@ pub const cpu = struct {
320256 pub const arch11 = Cpu{
321257 .name = "arch11",
322258 .llvm_name = "arch11",
323 .features = featureSet(&[_]Feature{
259 .features = featureSet(&all_features, &[_]Feature{
324260 .dfp_packed_conversion,
325261 .dfp_zoned_conversion,
326262 .distinct_ops,
......@@ -348,7 +284,7 @@ pub const cpu = struct {
348284 pub const arch12 = Cpu{
349285 .name = "arch12",
350286 .llvm_name = "arch12",
351 .features = featureSet(&[_]Feature{
287 .features = featureSet(&all_features, &[_]Feature{
352288 .dfp_packed_conversion,
353289 .dfp_zoned_conversion,
354290 .distinct_ops,
......@@ -383,7 +319,7 @@ pub const cpu = struct {
383319 pub const arch13 = Cpu{
384320 .name = "arch13",
385321 .llvm_name = "arch13",
386 .features = featureSet(&[_]Feature{
322 .features = featureSet(&all_features, &[_]Feature{
387323 .deflate_conversion,
388324 .dfp_packed_conversion,
389325 .dfp_zoned_conversion,
......@@ -424,12 +360,12 @@ pub const cpu = struct {
424360 pub const arch8 = Cpu{
425361 .name = "arch8",
426362 .llvm_name = "arch8",
427 .features = featureSet(&[_]Feature{}),
363 .features = featureSet(&all_features, &[_]Feature{}),
428364 };
429365 pub const arch9 = Cpu{
430366 .name = "arch9",
431367 .llvm_name = "arch9",
432 .features = featureSet(&[_]Feature{
368 .features = featureSet(&all_features, &[_]Feature{
433369 .distinct_ops,
434370 .fast_serialization,
435371 .fp_extension,
......@@ -445,17 +381,17 @@ pub const cpu = struct {
445381 pub const generic = Cpu{
446382 .name = "generic",
447383 .llvm_name = "generic",
448 .features = featureSet(&[_]Feature{}),
384 .features = featureSet(&all_features, &[_]Feature{}),
449385 };
450386 pub const z10 = Cpu{
451387 .name = "z10",
452388 .llvm_name = "z10",
453 .features = featureSet(&[_]Feature{}),
389 .features = featureSet(&all_features, &[_]Feature{}),
454390 };
455391 pub const z13 = Cpu{
456392 .name = "z13",
457393 .llvm_name = "z13",
458 .features = featureSet(&[_]Feature{
394 .features = featureSet(&all_features, &[_]Feature{
459395 .dfp_packed_conversion,
460396 .dfp_zoned_conversion,
461397 .distinct_ops,
......@@ -483,7 +419,7 @@ pub const cpu = struct {
483419 pub const z14 = Cpu{
484420 .name = "z14",
485421 .llvm_name = "z14",
486 .features = featureSet(&[_]Feature{
422 .features = featureSet(&all_features, &[_]Feature{
487423 .dfp_packed_conversion,
488424 .dfp_zoned_conversion,
489425 .distinct_ops,
......@@ -518,7 +454,7 @@ pub const cpu = struct {
518454 pub const z196 = Cpu{
519455 .name = "z196",
520456 .llvm_name = "z196",
521 .features = featureSet(&[_]Feature{
457 .features = featureSet(&all_features, &[_]Feature{
522458 .distinct_ops,
523459 .fast_serialization,
524460 .fp_extension,
......@@ -534,7 +470,7 @@ pub const cpu = struct {
534470 pub const zEC12 = Cpu{
535471 .name = "zEC12",
536472 .llvm_name = "zEC12",
537 .features = featureSet(&[_]Feature{
473 .features = featureSet(&all_features, &[_]Feature{
538474 .dfp_zoned_conversion,
539475 .distinct_ops,
540476 .enhanced_dat_2,
lib/std/target/wasm.zig+20-34
......@@ -18,80 +18,66 @@ pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
1818
1919pub const all_features = blk: {
2020 const len = @typeInfo(Feature).Enum.fields.len;
21 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
21 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
2222 var result: [len]Cpu.Feature = undefined;
2323 result[@enumToInt(Feature.atomics)] = .{
24 .index = @enumToInt(Feature.atomics),
25 .name = @tagName(Feature.atomics),
2624 .llvm_name = "atomics",
2725 .description = "Enable Atomics",
28 .dependencies = featureSet(&[_]Feature{}),
26 .dependencies = sparseFeatureSet(&[_]Feature{}),
2927 };
3028 result[@enumToInt(Feature.bulk_memory)] = .{
31 .index = @enumToInt(Feature.bulk_memory),
32 .name = @tagName(Feature.bulk_memory),
3329 .llvm_name = "bulk-memory",
3430 .description = "Enable bulk memory operations",
35 .dependencies = featureSet(&[_]Feature{}),
31 .dependencies = sparseFeatureSet(&[_]Feature{}),
3632 };
3733 result[@enumToInt(Feature.exception_handling)] = .{
38 .index = @enumToInt(Feature.exception_handling),
39 .name = @tagName(Feature.exception_handling),
4034 .llvm_name = "exception-handling",
4135 .description = "Enable Wasm exception handling",
42 .dependencies = featureSet(&[_]Feature{}),
36 .dependencies = sparseFeatureSet(&[_]Feature{}),
4337 };
4438 result[@enumToInt(Feature.multivalue)] = .{
45 .index = @enumToInt(Feature.multivalue),
46 .name = @tagName(Feature.multivalue),
4739 .llvm_name = "multivalue",
4840 .description = "Enable multivalue blocks, instructions, and functions",
49 .dependencies = featureSet(&[_]Feature{}),
41 .dependencies = sparseFeatureSet(&[_]Feature{}),
5042 };
5143 result[@enumToInt(Feature.mutable_globals)] = .{
52 .index = @enumToInt(Feature.mutable_globals),
53 .name = @tagName(Feature.mutable_globals),
5444 .llvm_name = "mutable-globals",
5545 .description = "Enable mutable globals",
56 .dependencies = featureSet(&[_]Feature{}),
46 .dependencies = sparseFeatureSet(&[_]Feature{}),
5747 };
5848 result[@enumToInt(Feature.nontrapping_fptoint)] = .{
59 .index = @enumToInt(Feature.nontrapping_fptoint),
60 .name = @tagName(Feature.nontrapping_fptoint),
6149 .llvm_name = "nontrapping-fptoint",
6250 .description = "Enable non-trapping float-to-int conversion operators",
63 .dependencies = featureSet(&[_]Feature{}),
51 .dependencies = sparseFeatureSet(&[_]Feature{}),
6452 };
6553 result[@enumToInt(Feature.sign_ext)] = .{
66 .index = @enumToInt(Feature.sign_ext),
67 .name = @tagName(Feature.sign_ext),
6854 .llvm_name = "sign-ext",
6955 .description = "Enable sign extension operators",
70 .dependencies = featureSet(&[_]Feature{}),
56 .dependencies = sparseFeatureSet(&[_]Feature{}),
7157 };
7258 result[@enumToInt(Feature.simd128)] = .{
73 .index = @enumToInt(Feature.simd128),
74 .name = @tagName(Feature.simd128),
7559 .llvm_name = "simd128",
7660 .description = "Enable 128-bit SIMD",
77 .dependencies = featureSet(&[_]Feature{}),
61 .dependencies = sparseFeatureSet(&[_]Feature{}),
7862 };
7963 result[@enumToInt(Feature.tail_call)] = .{
80 .index = @enumToInt(Feature.tail_call),
81 .name = @tagName(Feature.tail_call),
8264 .llvm_name = "tail-call",
8365 .description = "Enable tail call instructions",
84 .dependencies = featureSet(&[_]Feature{}),
66 .dependencies = sparseFeatureSet(&[_]Feature{}),
8567 };
8668 result[@enumToInt(Feature.unimplemented_simd128)] = .{
87 .index = @enumToInt(Feature.unimplemented_simd128),
88 .name = @tagName(Feature.unimplemented_simd128),
8969 .llvm_name = "unimplemented-simd128",
9070 .description = "Enable 128-bit SIMD not yet implemented in engines",
91 .dependencies = featureSet(&[_]Feature{
71 .dependencies = sparseFeatureSet(&[_]Feature{
9272 .simd128,
9373 }),
9474 };
75 const ti = @typeInfo(Feature);
76 for (result) |*elem, i| {
77 elem.index = i;
78 elem.name = ti.Enum.fields[i].name;
79 elem.dependencies.initAsDependencies(i, &result);
80 }
9581 break :blk result;
9682};
9783
......@@ -99,7 +85,7 @@ pub const cpu = struct {
9985 pub const bleeding_edge = Cpu{
10086 .name = "bleeding_edge",
10187 .llvm_name = "bleeding-edge",
102 .features = featureSet(&[_]Feature{
88 .features = featureSet(&all_features, &[_]Feature{
10389 .atomics,
10490 .mutable_globals,
10591 .nontrapping_fptoint,
......@@ -110,12 +96,12 @@ pub const cpu = struct {
11096 pub const generic = Cpu{
11197 .name = "generic",
11298 .llvm_name = "generic",
113 .features = featureSet(&[_]Feature{}),
99 .features = featureSet(&all_features, &[_]Feature{}),
114100 };
115101 pub const mvp = Cpu{
116102 .name = "mvp",
117103 .llvm_name = "mvp",
118 .features = featureSet(&[_]Feature{}),
104 .features = featureSet(&all_features, &[_]Feature{}),
119105 };
120106};
121107
lib/std/target/x86.zig+208-443
......@@ -128,940 +128,705 @@ pub const Feature = enum {
128128pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
129129
130130pub const all_features = blk: {
131 @setEvalBranchQuota(10000);
131132 const len = @typeInfo(Feature).Enum.fields.len;
132 std.debug.assert(len <= Cpu.Feature.Set.bit_count);
133 std.debug.assert(len <= Cpu.Feature.Set.needed_bit_count);
133134 var result: [len]Cpu.Feature = undefined;
134135 result[@enumToInt(Feature.@"3dnow")] = .{
135 .index = @enumToInt(Feature.@"3dnow"),
136 .name = @tagName(Feature.@"3dnow"),
137136 .llvm_name = "3dnow",
138137 .description = "Enable 3DNow! instructions",
139 .dependencies = featureSet(&[_]Feature{
138 .dependencies = sparseFeatureSet(&[_]Feature{
140139 .mmx,
141140 }),
142141 };
143142 result[@enumToInt(Feature.@"3dnowa")] = .{
144 .index = @enumToInt(Feature.@"3dnowa"),
145 .name = @tagName(Feature.@"3dnowa"),
146143 .llvm_name = "3dnowa",
147144 .description = "Enable 3DNow! Athlon instructions",
148 .dependencies = featureSet(&[_]Feature{
145 .dependencies = sparseFeatureSet(&[_]Feature{
149146 .@"3dnow",
150147 }),
151148 };
152149 result[@enumToInt(Feature.@"64bit")] = .{
153 .index = @enumToInt(Feature.@"64bit"),
154 .name = @tagName(Feature.@"64bit"),
155150 .llvm_name = "64bit",
156151 .description = "Support 64-bit instructions",
157 .dependencies = featureSet(&[_]Feature{}),
152 .dependencies = sparseFeatureSet(&[_]Feature{}),
158153 };
159154 result[@enumToInt(Feature.adx)] = .{
160 .index = @enumToInt(Feature.adx),
161 .name = @tagName(Feature.adx),
162155 .llvm_name = "adx",
163156 .description = "Support ADX instructions",
164 .dependencies = featureSet(&[_]Feature{}),
157 .dependencies = sparseFeatureSet(&[_]Feature{}),
165158 };
166159 result[@enumToInt(Feature.aes)] = .{
167 .index = @enumToInt(Feature.aes),
168 .name = @tagName(Feature.aes),
169160 .llvm_name = "aes",
170161 .description = "Enable AES instructions",
171 .dependencies = featureSet(&[_]Feature{
162 .dependencies = sparseFeatureSet(&[_]Feature{
172163 .sse2,
173164 }),
174165 };
175166 result[@enumToInt(Feature.avx)] = .{
176 .index = @enumToInt(Feature.avx),
177 .name = @tagName(Feature.avx),
178167 .llvm_name = "avx",
179168 .description = "Enable AVX instructions",
180 .dependencies = featureSet(&[_]Feature{
169 .dependencies = sparseFeatureSet(&[_]Feature{
181170 .sse4_2,
182171 }),
183172 };
184173 result[@enumToInt(Feature.avx2)] = .{
185 .index = @enumToInt(Feature.avx2),
186 .name = @tagName(Feature.avx2),
187174 .llvm_name = "avx2",
188175 .description = "Enable AVX2 instructions",
189 .dependencies = featureSet(&[_]Feature{
176 .dependencies = sparseFeatureSet(&[_]Feature{
190177 .avx,
191178 }),
192179 };
193180 result[@enumToInt(Feature.avx512bf16)] = .{
194 .index = @enumToInt(Feature.avx512bf16),
195 .name = @tagName(Feature.avx512bf16),
196181 .llvm_name = "avx512bf16",
197182 .description = "Support bfloat16 floating point",
198 .dependencies = featureSet(&[_]Feature{
183 .dependencies = sparseFeatureSet(&[_]Feature{
199184 .avx512bw,
200185 }),
201186 };
202187 result[@enumToInt(Feature.avx512bitalg)] = .{
203 .index = @enumToInt(Feature.avx512bitalg),
204 .name = @tagName(Feature.avx512bitalg),
205188 .llvm_name = "avx512bitalg",
206189 .description = "Enable AVX-512 Bit Algorithms",
207 .dependencies = featureSet(&[_]Feature{
190 .dependencies = sparseFeatureSet(&[_]Feature{
208191 .avx512bw,
209192 }),
210193 };
211194 result[@enumToInt(Feature.avx512bw)] = .{
212 .index = @enumToInt(Feature.avx512bw),
213 .name = @tagName(Feature.avx512bw),
214195 .llvm_name = "avx512bw",
215196 .description = "Enable AVX-512 Byte and Word Instructions",
216 .dependencies = featureSet(&[_]Feature{
197 .dependencies = sparseFeatureSet(&[_]Feature{
217198 .avx512f,
218199 }),
219200 };
220201 result[@enumToInt(Feature.avx512cd)] = .{
221 .index = @enumToInt(Feature.avx512cd),
222 .name = @tagName(Feature.avx512cd),
223202 .llvm_name = "avx512cd",
224203 .description = "Enable AVX-512 Conflict Detection Instructions",
225 .dependencies = featureSet(&[_]Feature{
204 .dependencies = sparseFeatureSet(&[_]Feature{
226205 .avx512f,
227206 }),
228207 };
229208 result[@enumToInt(Feature.avx512dq)] = .{
230 .index = @enumToInt(Feature.avx512dq),
231 .name = @tagName(Feature.avx512dq),
232209 .llvm_name = "avx512dq",
233210 .description = "Enable AVX-512 Doubleword and Quadword Instructions",
234 .dependencies = featureSet(&[_]Feature{
211 .dependencies = sparseFeatureSet(&[_]Feature{
235212 .avx512f,
236213 }),
237214 };
238215 result[@enumToInt(Feature.avx512er)] = .{
239 .index = @enumToInt(Feature.avx512er),
240 .name = @tagName(Feature.avx512er),
241216 .llvm_name = "avx512er",
242217 .description = "Enable AVX-512 Exponential and Reciprocal Instructions",
243 .dependencies = featureSet(&[_]Feature{
218 .dependencies = sparseFeatureSet(&[_]Feature{
244219 .avx512f,
245220 }),
246221 };
247222 result[@enumToInt(Feature.avx512f)] = .{
248 .index = @enumToInt(Feature.avx512f),
249 .name = @tagName(Feature.avx512f),
250223 .llvm_name = "avx512f",
251224 .description = "Enable AVX-512 instructions",
252 .dependencies = featureSet(&[_]Feature{
225 .dependencies = sparseFeatureSet(&[_]Feature{
253226 .avx2,
254227 .f16c,
255228 .fma,
256229 }),
257230 };
258231 result[@enumToInt(Feature.avx512ifma)] = .{
259 .index = @enumToInt(Feature.avx512ifma),
260 .name = @tagName(Feature.avx512ifma),
261232 .llvm_name = "avx512ifma",
262233 .description = "Enable AVX-512 Integer Fused Multiple-Add",
263 .dependencies = featureSet(&[_]Feature{
234 .dependencies = sparseFeatureSet(&[_]Feature{
264235 .avx512f,
265236 }),
266237 };
267238 result[@enumToInt(Feature.avx512pf)] = .{
268 .index = @enumToInt(Feature.avx512pf),
269 .name = @tagName(Feature.avx512pf),
270239 .llvm_name = "avx512pf",
271240 .description = "Enable AVX-512 PreFetch Instructions",
272 .dependencies = featureSet(&[_]Feature{
241 .dependencies = sparseFeatureSet(&[_]Feature{
273242 .avx512f,
274243 }),
275244 };
276245 result[@enumToInt(Feature.avx512vbmi)] = .{
277 .index = @enumToInt(Feature.avx512vbmi),
278 .name = @tagName(Feature.avx512vbmi),
279246 .llvm_name = "avx512vbmi",
280247 .description = "Enable AVX-512 Vector Byte Manipulation Instructions",
281 .dependencies = featureSet(&[_]Feature{
248 .dependencies = sparseFeatureSet(&[_]Feature{
282249 .avx512bw,
283250 }),
284251 };
285252 result[@enumToInt(Feature.avx512vbmi2)] = .{
286 .index = @enumToInt(Feature.avx512vbmi2),
287 .name = @tagName(Feature.avx512vbmi2),
288253 .llvm_name = "avx512vbmi2",
289254 .description = "Enable AVX-512 further Vector Byte Manipulation Instructions",
290 .dependencies = featureSet(&[_]Feature{
255 .dependencies = sparseFeatureSet(&[_]Feature{
291256 .avx512bw,
292257 }),
293258 };
294259 result[@enumToInt(Feature.avx512vl)] = .{
295 .index = @enumToInt(Feature.avx512vl),
296 .name = @tagName(Feature.avx512vl),
297260 .llvm_name = "avx512vl",
298261 .description = "Enable AVX-512 Vector Length eXtensions",
299 .dependencies = featureSet(&[_]Feature{
262 .dependencies = sparseFeatureSet(&[_]Feature{
300263 .avx512f,
301264 }),
302265 };
303266 result[@enumToInt(Feature.avx512vnni)] = .{
304 .index = @enumToInt(Feature.avx512vnni),
305 .name = @tagName(Feature.avx512vnni),
306267 .llvm_name = "avx512vnni",
307268 .description = "Enable AVX-512 Vector Neural Network Instructions",
308 .dependencies = featureSet(&[_]Feature{
269 .dependencies = sparseFeatureSet(&[_]Feature{
309270 .avx512f,
310271 }),
311272 };
312273 result[@enumToInt(Feature.avx512vp2intersect)] = .{
313 .index = @enumToInt(Feature.avx512vp2intersect),
314 .name = @tagName(Feature.avx512vp2intersect),
315274 .llvm_name = "avx512vp2intersect",
316275 .description = "Enable AVX-512 vp2intersect",
317 .dependencies = featureSet(&[_]Feature{
276 .dependencies = sparseFeatureSet(&[_]Feature{
318277 .avx512f,
319278 }),
320279 };
321280 result[@enumToInt(Feature.avx512vpopcntdq)] = .{
322 .index = @enumToInt(Feature.avx512vpopcntdq),
323 .name = @tagName(Feature.avx512vpopcntdq),
324281 .llvm_name = "avx512vpopcntdq",
325282 .description = "Enable AVX-512 Population Count Instructions",
326 .dependencies = featureSet(&[_]Feature{
283 .dependencies = sparseFeatureSet(&[_]Feature{
327284 .avx512f,
328285 }),
329286 };
330287 result[@enumToInt(Feature.bmi)] = .{
331 .index = @enumToInt(Feature.bmi),
332 .name = @tagName(Feature.bmi),
333288 .llvm_name = "bmi",
334289 .description = "Support BMI instructions",
335 .dependencies = featureSet(&[_]Feature{}),
290 .dependencies = sparseFeatureSet(&[_]Feature{}),
336291 };
337292 result[@enumToInt(Feature.bmi2)] = .{
338 .index = @enumToInt(Feature.bmi2),
339 .name = @tagName(Feature.bmi2),
340293 .llvm_name = "bmi2",
341294 .description = "Support BMI2 instructions",
342 .dependencies = featureSet(&[_]Feature{}),
295 .dependencies = sparseFeatureSet(&[_]Feature{}),
343296 };
344297 result[@enumToInt(Feature.branchfusion)] = .{
345 .index = @enumToInt(Feature.branchfusion),
346 .name = @tagName(Feature.branchfusion),
347298 .llvm_name = "branchfusion",
348299 .description = "CMP/TEST can be fused with conditional branches",
349 .dependencies = featureSet(&[_]Feature{}),
300 .dependencies = sparseFeatureSet(&[_]Feature{}),
350301 };
351302 result[@enumToInt(Feature.cldemote)] = .{
352 .index = @enumToInt(Feature.cldemote),
353 .name = @tagName(Feature.cldemote),
354303 .llvm_name = "cldemote",
355304 .description = "Enable Cache Demote",
356 .dependencies = featureSet(&[_]Feature{}),
305 .dependencies = sparseFeatureSet(&[_]Feature{}),
357306 };
358307 result[@enumToInt(Feature.clflushopt)] = .{
359 .index = @enumToInt(Feature.clflushopt),
360 .name = @tagName(Feature.clflushopt),
361308 .llvm_name = "clflushopt",
362309 .description = "Flush A Cache Line Optimized",
363 .dependencies = featureSet(&[_]Feature{}),
310 .dependencies = sparseFeatureSet(&[_]Feature{}),
364311 };
365312 result[@enumToInt(Feature.clwb)] = .{
366 .index = @enumToInt(Feature.clwb),
367 .name = @tagName(Feature.clwb),
368313 .llvm_name = "clwb",
369314 .description = "Cache Line Write Back",
370 .dependencies = featureSet(&[_]Feature{}),
315 .dependencies = sparseFeatureSet(&[_]Feature{}),
371316 };
372317 result[@enumToInt(Feature.clzero)] = .{
373 .index = @enumToInt(Feature.clzero),
374 .name = @tagName(Feature.clzero),
375318 .llvm_name = "clzero",
376319 .description = "Enable Cache Line Zero",
377 .dependencies = featureSet(&[_]Feature{}),
320 .dependencies = sparseFeatureSet(&[_]Feature{}),
378321 };
379322 result[@enumToInt(Feature.cmov)] = .{
380 .index = @enumToInt(Feature.cmov),
381 .name = @tagName(Feature.cmov),
382323 .llvm_name = "cmov",
383324 .description = "Enable conditional move instructions",
384 .dependencies = featureSet(&[_]Feature{}),
325 .dependencies = sparseFeatureSet(&[_]Feature{}),
385326 };
386327 result[@enumToInt(Feature.cx16)] = .{
387 .index = @enumToInt(Feature.cx16),
388 .name = @tagName(Feature.cx16),
389328 .llvm_name = "cx16",
390329 .description = "64-bit with cmpxchg16b",
391 .dependencies = featureSet(&[_]Feature{
330 .dependencies = sparseFeatureSet(&[_]Feature{
392331 .cx8,
393332 }),
394333 };
395334 result[@enumToInt(Feature.cx8)] = .{
396 .index = @enumToInt(Feature.cx8),
397 .name = @tagName(Feature.cx8),
398335 .llvm_name = "cx8",
399336 .description = "Support CMPXCHG8B instructions",
400 .dependencies = featureSet(&[_]Feature{}),
337 .dependencies = sparseFeatureSet(&[_]Feature{}),
401338 };
402339 result[@enumToInt(Feature.enqcmd)] = .{
403 .index = @enumToInt(Feature.enqcmd),
404 .name = @tagName(Feature.enqcmd),
405340 .llvm_name = "enqcmd",
406341 .description = "Has ENQCMD instructions",
407 .dependencies = featureSet(&[_]Feature{}),
342 .dependencies = sparseFeatureSet(&[_]Feature{}),
408343 };
409344 result[@enumToInt(Feature.ermsb)] = .{
410 .index = @enumToInt(Feature.ermsb),
411 .name = @tagName(Feature.ermsb),
412345 .llvm_name = "ermsb",
413346 .description = "REP MOVS/STOS are fast",
414 .dependencies = featureSet(&[_]Feature{}),
347 .dependencies = sparseFeatureSet(&[_]Feature{}),
415348 };
416349 result[@enumToInt(Feature.f16c)] = .{
417 .index = @enumToInt(Feature.f16c),
418 .name = @tagName(Feature.f16c),
419350 .llvm_name = "f16c",
420351 .description = "Support 16-bit floating point conversion instructions",
421 .dependencies = featureSet(&[_]Feature{
352 .dependencies = sparseFeatureSet(&[_]Feature{
422353 .avx,
423354 }),
424355 };
425356 result[@enumToInt(Feature.false_deps_lzcnt_tzcnt)] = .{
426 .index = @enumToInt(Feature.false_deps_lzcnt_tzcnt),
427 .name = @tagName(Feature.false_deps_lzcnt_tzcnt),
428357 .llvm_name = "false-deps-lzcnt-tzcnt",
429358 .description = "LZCNT/TZCNT have a false dependency on dest register",
430 .dependencies = featureSet(&[_]Feature{}),
359 .dependencies = sparseFeatureSet(&[_]Feature{}),
431360 };
432361 result[@enumToInt(Feature.false_deps_popcnt)] = .{
433 .index = @enumToInt(Feature.false_deps_popcnt),
434 .name = @tagName(Feature.false_deps_popcnt),
435362 .llvm_name = "false-deps-popcnt",
436363 .description = "POPCNT has a false dependency on dest register",
437 .dependencies = featureSet(&[_]Feature{}),
364 .dependencies = sparseFeatureSet(&[_]Feature{}),
438365 };
439366 result[@enumToInt(Feature.fast_11bytenop)] = .{
440 .index = @enumToInt(Feature.fast_11bytenop),
441 .name = @tagName(Feature.fast_11bytenop),
442367 .llvm_name = "fast-11bytenop",
443368 .description = "Target can quickly decode up to 11 byte NOPs",
444 .dependencies = featureSet(&[_]Feature{}),
369 .dependencies = sparseFeatureSet(&[_]Feature{}),
445370 };
446371 result[@enumToInt(Feature.fast_15bytenop)] = .{
447 .index = @enumToInt(Feature.fast_15bytenop),
448 .name = @tagName(Feature.fast_15bytenop),
449372 .llvm_name = "fast-15bytenop",
450373 .description = "Target can quickly decode up to 15 byte NOPs",
451 .dependencies = featureSet(&[_]Feature{}),
374 .dependencies = sparseFeatureSet(&[_]Feature{}),
452375 };
453376 result[@enumToInt(Feature.fast_bextr)] = .{
454 .index = @enumToInt(Feature.fast_bextr),
455 .name = @tagName(Feature.fast_bextr),
456377 .llvm_name = "fast-bextr",
457378 .description = "Indicates that the BEXTR instruction is implemented as a single uop with good throughput",
458 .dependencies = featureSet(&[_]Feature{}),
379 .dependencies = sparseFeatureSet(&[_]Feature{}),
459380 };
460381 result[@enumToInt(Feature.fast_gather)] = .{
461 .index = @enumToInt(Feature.fast_gather),
462 .name = @tagName(Feature.fast_gather),
463382 .llvm_name = "fast-gather",
464383 .description = "Indicates if gather is reasonably fast",
465 .dependencies = featureSet(&[_]Feature{}),
384 .dependencies = sparseFeatureSet(&[_]Feature{}),
466385 };
467386 result[@enumToInt(Feature.fast_hops)] = .{
468 .index = @enumToInt(Feature.fast_hops),
469 .name = @tagName(Feature.fast_hops),
470387 .llvm_name = "fast-hops",
471388 .description = "Prefer horizontal vector math instructions (haddp, phsub, etc.) over normal vector instructions with shuffles",
472 .dependencies = featureSet(&[_]Feature{
389 .dependencies = sparseFeatureSet(&[_]Feature{
473390 .sse3,
474391 }),
475392 };
476393 result[@enumToInt(Feature.fast_lzcnt)] = .{
477 .index = @enumToInt(Feature.fast_lzcnt),
478 .name = @tagName(Feature.fast_lzcnt),
479394 .llvm_name = "fast-lzcnt",
480395 .description = "LZCNT instructions are as fast as most simple integer ops",
481 .dependencies = featureSet(&[_]Feature{}),
396 .dependencies = sparseFeatureSet(&[_]Feature{}),
482397 };
483398 result[@enumToInt(Feature.fast_partial_ymm_or_zmm_write)] = .{
484 .index = @enumToInt(Feature.fast_partial_ymm_or_zmm_write),
485 .name = @tagName(Feature.fast_partial_ymm_or_zmm_write),
486399 .llvm_name = "fast-partial-ymm-or-zmm-write",
487400 .description = "Partial writes to YMM/ZMM registers are fast",
488 .dependencies = featureSet(&[_]Feature{}),
401 .dependencies = sparseFeatureSet(&[_]Feature{}),
489402 };
490403 result[@enumToInt(Feature.fast_scalar_fsqrt)] = .{
491 .index = @enumToInt(Feature.fast_scalar_fsqrt),
492 .name = @tagName(Feature.fast_scalar_fsqrt),
493404 .llvm_name = "fast-scalar-fsqrt",
494405 .description = "Scalar SQRT is fast (disable Newton-Raphson)",
495 .dependencies = featureSet(&[_]Feature{}),
406 .dependencies = sparseFeatureSet(&[_]Feature{}),
496407 };
497408 result[@enumToInt(Feature.fast_scalar_shift_masks)] = .{
498 .index = @enumToInt(Feature.fast_scalar_shift_masks),
499 .name = @tagName(Feature.fast_scalar_shift_masks),
500409 .llvm_name = "fast-scalar-shift-masks",
501410 .description = "Prefer a left/right scalar logical shift pair over a shift+and pair",
502 .dependencies = featureSet(&[_]Feature{}),
411 .dependencies = sparseFeatureSet(&[_]Feature{}),
503412 };
504413 result[@enumToInt(Feature.fast_shld_rotate)] = .{
505 .index = @enumToInt(Feature.fast_shld_rotate),
506 .name = @tagName(Feature.fast_shld_rotate),
507414 .llvm_name = "fast-shld-rotate",
508415 .description = "SHLD can be used as a faster rotate",
509 .dependencies = featureSet(&[_]Feature{}),
416 .dependencies = sparseFeatureSet(&[_]Feature{}),
510417 };
511418 result[@enumToInt(Feature.fast_variable_shuffle)] = .{
512 .index = @enumToInt(Feature.fast_variable_shuffle),
513 .name = @tagName(Feature.fast_variable_shuffle),
514419 .llvm_name = "fast-variable-shuffle",
515420 .description = "Shuffles with variable masks are fast",
516 .dependencies = featureSet(&[_]Feature{}),
421 .dependencies = sparseFeatureSet(&[_]Feature{}),
517422 };
518423 result[@enumToInt(Feature.fast_vector_fsqrt)] = .{
519 .index = @enumToInt(Feature.fast_vector_fsqrt),
520 .name = @tagName(Feature.fast_vector_fsqrt),
521424 .llvm_name = "fast-vector-fsqrt",
522425 .description = "Vector SQRT is fast (disable Newton-Raphson)",
523 .dependencies = featureSet(&[_]Feature{}),
426 .dependencies = sparseFeatureSet(&[_]Feature{}),
524427 };
525428 result[@enumToInt(Feature.fast_vector_shift_masks)] = .{
526 .index = @enumToInt(Feature.fast_vector_shift_masks),
527 .name = @tagName(Feature.fast_vector_shift_masks),
528429 .llvm_name = "fast-vector-shift-masks",
529430 .description = "Prefer a left/right vector logical shift pair over a shift+and pair",
530 .dependencies = featureSet(&[_]Feature{}),
431 .dependencies = sparseFeatureSet(&[_]Feature{}),
531432 };
532433 result[@enumToInt(Feature.fma)] = .{
533 .index = @enumToInt(Feature.fma),
534 .name = @tagName(Feature.fma),
535434 .llvm_name = "fma",
536435 .description = "Enable three-operand fused multiple-add",
537 .dependencies = featureSet(&[_]Feature{
436 .dependencies = sparseFeatureSet(&[_]Feature{
538437 .avx,
539438 }),
540439 };
541440 result[@enumToInt(Feature.fma4)] = .{
542 .index = @enumToInt(Feature.fma4),
543 .name = @tagName(Feature.fma4),
544441 .llvm_name = "fma4",
545442 .description = "Enable four-operand fused multiple-add",
546 .dependencies = featureSet(&[_]Feature{
443 .dependencies = sparseFeatureSet(&[_]Feature{
547444 .avx,
548445 .sse4a,
549446 }),
550447 };
551448 result[@enumToInt(Feature.fsgsbase)] = .{
552 .index = @enumToInt(Feature.fsgsbase),
553 .name = @tagName(Feature.fsgsbase),
554449 .llvm_name = "fsgsbase",
555450 .description = "Support FS/GS Base instructions",
556 .dependencies = featureSet(&[_]Feature{}),
451 .dependencies = sparseFeatureSet(&[_]Feature{}),
557452 };
558453 result[@enumToInt(Feature.fxsr)] = .{
559 .index = @enumToInt(Feature.fxsr),
560 .name = @tagName(Feature.fxsr),
561454 .llvm_name = "fxsr",
562455 .description = "Support fxsave/fxrestore instructions",
563 .dependencies = featureSet(&[_]Feature{}),
456 .dependencies = sparseFeatureSet(&[_]Feature{}),
564457 };
565458 result[@enumToInt(Feature.gfni)] = .{
566 .index = @enumToInt(Feature.gfni),
567 .name = @tagName(Feature.gfni),
568459 .llvm_name = "gfni",
569460 .description = "Enable Galois Field Arithmetic Instructions",
570 .dependencies = featureSet(&[_]Feature{
461 .dependencies = sparseFeatureSet(&[_]Feature{
571462 .sse2,
572463 }),
573464 };
574465 result[@enumToInt(Feature.idivl_to_divb)] = .{
575 .index = @enumToInt(Feature.idivl_to_divb),
576 .name = @tagName(Feature.idivl_to_divb),
577466 .llvm_name = "idivl-to-divb",
578467 .description = "Use 8-bit divide for positive values less than 256",
579 .dependencies = featureSet(&[_]Feature{}),
468 .dependencies = sparseFeatureSet(&[_]Feature{}),
580469 };
581470 result[@enumToInt(Feature.idivq_to_divl)] = .{
582 .index = @enumToInt(Feature.idivq_to_divl),
583 .name = @tagName(Feature.idivq_to_divl),
584471 .llvm_name = "idivq-to-divl",
585472 .description = "Use 32-bit divide for positive values less than 2^32",
586 .dependencies = featureSet(&[_]Feature{}),
473 .dependencies = sparseFeatureSet(&[_]Feature{}),
587474 };
588475 result[@enumToInt(Feature.invpcid)] = .{
589 .index = @enumToInt(Feature.invpcid),
590 .name = @tagName(Feature.invpcid),
591476 .llvm_name = "invpcid",
592477 .description = "Invalidate Process-Context Identifier",
593 .dependencies = featureSet(&[_]Feature{}),
478 .dependencies = sparseFeatureSet(&[_]Feature{}),
594479 };
595480 result[@enumToInt(Feature.lea_sp)] = .{
596 .index = @enumToInt(Feature.lea_sp),
597 .name = @tagName(Feature.lea_sp),
598481 .llvm_name = "lea-sp",
599482 .description = "Use LEA for adjusting the stack pointer",
600 .dependencies = featureSet(&[_]Feature{}),
483 .dependencies = sparseFeatureSet(&[_]Feature{}),
601484 };
602485 result[@enumToInt(Feature.lea_uses_ag)] = .{
603 .index = @enumToInt(Feature.lea_uses_ag),
604 .name = @tagName(Feature.lea_uses_ag),
605486 .llvm_name = "lea-uses-ag",
606487 .description = "LEA instruction needs inputs at AG stage",
607 .dependencies = featureSet(&[_]Feature{}),
488 .dependencies = sparseFeatureSet(&[_]Feature{}),
608489 };
609490 result[@enumToInt(Feature.lwp)] = .{
610 .index = @enumToInt(Feature.lwp),
611 .name = @tagName(Feature.lwp),
612491 .llvm_name = "lwp",
613492 .description = "Enable LWP instructions",
614 .dependencies = featureSet(&[_]Feature{}),
493 .dependencies = sparseFeatureSet(&[_]Feature{}),
615494 };
616495 result[@enumToInt(Feature.lzcnt)] = .{
617 .index = @enumToInt(Feature.lzcnt),
618 .name = @tagName(Feature.lzcnt),
619496 .llvm_name = "lzcnt",
620497 .description = "Support LZCNT instruction",
621 .dependencies = featureSet(&[_]Feature{}),
498 .dependencies = sparseFeatureSet(&[_]Feature{}),
622499 };
623500 result[@enumToInt(Feature.macrofusion)] = .{
624 .index = @enumToInt(Feature.macrofusion),
625 .name = @tagName(Feature.macrofusion),
626501 .llvm_name = "macrofusion",
627502 .description = "Various instructions can be fused with conditional branches",
628 .dependencies = featureSet(&[_]Feature{}),
503 .dependencies = sparseFeatureSet(&[_]Feature{}),
629504 };
630505 result[@enumToInt(Feature.merge_to_threeway_branch)] = .{
631 .index = @enumToInt(Feature.merge_to_threeway_branch),
632 .name = @tagName(Feature.merge_to_threeway_branch),
633506 .llvm_name = "merge-to-threeway-branch",
634507 .description = "Merge branches to a three-way conditional branch",
635 .dependencies = featureSet(&[_]Feature{}),
508 .dependencies = sparseFeatureSet(&[_]Feature{}),
636509 };
637510 result[@enumToInt(Feature.mmx)] = .{
638 .index = @enumToInt(Feature.mmx),
639 .name = @tagName(Feature.mmx),
640511 .llvm_name = "mmx",
641512 .description = "Enable MMX instructions",
642 .dependencies = featureSet(&[_]Feature{}),
513 .dependencies = sparseFeatureSet(&[_]Feature{}),
643514 };
644515 result[@enumToInt(Feature.movbe)] = .{
645 .index = @enumToInt(Feature.movbe),
646 .name = @tagName(Feature.movbe),
647516 .llvm_name = "movbe",
648517 .description = "Support MOVBE instruction",
649 .dependencies = featureSet(&[_]Feature{}),
518 .dependencies = sparseFeatureSet(&[_]Feature{}),
650519 };
651520 result[@enumToInt(Feature.movdir64b)] = .{
652 .index = @enumToInt(Feature.movdir64b),
653 .name = @tagName(Feature.movdir64b),
654521 .llvm_name = "movdir64b",
655522 .description = "Support movdir64b instruction",
656 .dependencies = featureSet(&[_]Feature{}),
523 .dependencies = sparseFeatureSet(&[_]Feature{}),
657524 };
658525 result[@enumToInt(Feature.movdiri)] = .{
659 .index = @enumToInt(Feature.movdiri),
660 .name = @tagName(Feature.movdiri),
661526 .llvm_name = "movdiri",
662527 .description = "Support movdiri instruction",
663 .dependencies = featureSet(&[_]Feature{}),
528 .dependencies = sparseFeatureSet(&[_]Feature{}),
664529 };
665530 result[@enumToInt(Feature.mpx)] = .{
666 .index = @enumToInt(Feature.mpx),
667 .name = @tagName(Feature.mpx),
668531 .llvm_name = "mpx",
669532 .description = "Support MPX instructions",
670 .dependencies = featureSet(&[_]Feature{}),
533 .dependencies = sparseFeatureSet(&[_]Feature{}),
671534 };
672535 result[@enumToInt(Feature.mwaitx)] = .{
673 .index = @enumToInt(Feature.mwaitx),
674 .name = @tagName(Feature.mwaitx),
675536 .llvm_name = "mwaitx",
676537 .description = "Enable MONITORX/MWAITX timer functionality",
677 .dependencies = featureSet(&[_]Feature{}),
538 .dependencies = sparseFeatureSet(&[_]Feature{}),
678539 };
679540 result[@enumToInt(Feature.nopl)] = .{
680 .index = @enumToInt(Feature.nopl),
681 .name = @tagName(Feature.nopl),
682541 .llvm_name = "nopl",
683542 .description = "Enable NOPL instruction",
684 .dependencies = featureSet(&[_]Feature{}),
543 .dependencies = sparseFeatureSet(&[_]Feature{}),
685544 };
686545 result[@enumToInt(Feature.pad_short_functions)] = .{
687 .index = @enumToInt(Feature.pad_short_functions),
688 .name = @tagName(Feature.pad_short_functions),
689546 .llvm_name = "pad-short-functions",
690547 .description = "Pad short functions",
691 .dependencies = featureSet(&[_]Feature{}),
548 .dependencies = sparseFeatureSet(&[_]Feature{}),
692549 };
693550 result[@enumToInt(Feature.pclmul)] = .{
694 .index = @enumToInt(Feature.pclmul),
695 .name = @tagName(Feature.pclmul),
696551 .llvm_name = "pclmul",
697552 .description = "Enable packed carry-less multiplication instructions",
698 .dependencies = featureSet(&[_]Feature{
553 .dependencies = sparseFeatureSet(&[_]Feature{
699554 .sse2,
700555 }),
701556 };
702557 result[@enumToInt(Feature.pconfig)] = .{
703 .index = @enumToInt(Feature.pconfig),
704 .name = @tagName(Feature.pconfig),
705558 .llvm_name = "pconfig",
706559 .description = "platform configuration instruction",
707 .dependencies = featureSet(&[_]Feature{}),
560 .dependencies = sparseFeatureSet(&[_]Feature{}),
708561 };
709562 result[@enumToInt(Feature.pku)] = .{
710 .index = @enumToInt(Feature.pku),
711 .name = @tagName(Feature.pku),
712563 .llvm_name = "pku",
713564 .description = "Enable protection keys",
714 .dependencies = featureSet(&[_]Feature{}),
565 .dependencies = sparseFeatureSet(&[_]Feature{}),
715566 };
716567 result[@enumToInt(Feature.popcnt)] = .{
717 .index = @enumToInt(Feature.popcnt),
718 .name = @tagName(Feature.popcnt),
719568 .llvm_name = "popcnt",
720569 .description = "Support POPCNT instruction",
721 .dependencies = featureSet(&[_]Feature{}),
570 .dependencies = sparseFeatureSet(&[_]Feature{}),
722571 };
723572 result[@enumToInt(Feature.prefer_256_bit)] = .{
724 .index = @enumToInt(Feature.prefer_256_bit),
725 .name = @tagName(Feature.prefer_256_bit),
726573 .llvm_name = "prefer-256-bit",
727574 .description = "Prefer 256-bit AVX instructions",
728 .dependencies = featureSet(&[_]Feature{}),
575 .dependencies = sparseFeatureSet(&[_]Feature{}),
729576 };
730577 result[@enumToInt(Feature.prefetchwt1)] = .{
731 .index = @enumToInt(Feature.prefetchwt1),
732 .name = @tagName(Feature.prefetchwt1),
733578 .llvm_name = "prefetchwt1",
734579 .description = "Prefetch with Intent to Write and T1 Hint",
735 .dependencies = featureSet(&[_]Feature{}),
580 .dependencies = sparseFeatureSet(&[_]Feature{}),
736581 };
737582 result[@enumToInt(Feature.prfchw)] = .{
738 .index = @enumToInt(Feature.prfchw),
739 .name = @tagName(Feature.prfchw),
740583 .llvm_name = "prfchw",
741584 .description = "Support PRFCHW instructions",
742 .dependencies = featureSet(&[_]Feature{}),
585 .dependencies = sparseFeatureSet(&[_]Feature{}),
743586 };
744587 result[@enumToInt(Feature.ptwrite)] = .{
745 .index = @enumToInt(Feature.ptwrite),
746 .name = @tagName(Feature.ptwrite),
747588 .llvm_name = "ptwrite",
748589 .description = "Support ptwrite instruction",
749 .dependencies = featureSet(&[_]Feature{}),
590 .dependencies = sparseFeatureSet(&[_]Feature{}),
750591 };
751592 result[@enumToInt(Feature.rdpid)] = .{
752 .index = @enumToInt(Feature.rdpid),
753 .name = @tagName(Feature.rdpid),
754593 .llvm_name = "rdpid",
755594 .description = "Support RDPID instructions",
756 .dependencies = featureSet(&[_]Feature{}),
595 .dependencies = sparseFeatureSet(&[_]Feature{}),
757596 };
758597 result[@enumToInt(Feature.rdrnd)] = .{
759 .index = @enumToInt(Feature.rdrnd),
760 .name = @tagName(Feature.rdrnd),
761598 .llvm_name = "rdrnd",
762599 .description = "Support RDRAND instruction",
763 .dependencies = featureSet(&[_]Feature{}),
600 .dependencies = sparseFeatureSet(&[_]Feature{}),
764601 };
765602 result[@enumToInt(Feature.rdseed)] = .{
766 .index = @enumToInt(Feature.rdseed),
767 .name = @tagName(Feature.rdseed),
768603 .llvm_name = "rdseed",
769604 .description = "Support RDSEED instruction",
770 .dependencies = featureSet(&[_]Feature{}),
605 .dependencies = sparseFeatureSet(&[_]Feature{}),
771606 };
772607 result[@enumToInt(Feature.retpoline)] = .{
773 .index = @enumToInt(Feature.retpoline),
774 .name = @tagName(Feature.retpoline),
775608 .llvm_name = "retpoline",
776609 .description = "Remove speculation of indirect branches from the generated code, either by avoiding them entirely or lowering them with a speculation blocking construct",
777 .dependencies = featureSet(&[_]Feature{
610 .dependencies = sparseFeatureSet(&[_]Feature{
778611 .retpoline_indirect_branches,
779612 .retpoline_indirect_calls,
780613 }),
781614 };
782615 result[@enumToInt(Feature.retpoline_external_thunk)] = .{
783 .index = @enumToInt(Feature.retpoline_external_thunk),
784 .name = @tagName(Feature.retpoline_external_thunk),
785616 .llvm_name = "retpoline-external-thunk",
786617 .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",
787 .dependencies = featureSet(&[_]Feature{
618 .dependencies = sparseFeatureSet(&[_]Feature{
788619 .retpoline_indirect_calls,
789620 }),
790621 };
791622 result[@enumToInt(Feature.retpoline_indirect_branches)] = .{
792 .index = @enumToInt(Feature.retpoline_indirect_branches),
793 .name = @tagName(Feature.retpoline_indirect_branches),
794623 .llvm_name = "retpoline-indirect-branches",
795624 .description = "Remove speculation of indirect branches from the generated code",
796 .dependencies = featureSet(&[_]Feature{}),
625 .dependencies = sparseFeatureSet(&[_]Feature{}),
797626 };
798627 result[@enumToInt(Feature.retpoline_indirect_calls)] = .{
799 .index = @enumToInt(Feature.retpoline_indirect_calls),
800 .name = @tagName(Feature.retpoline_indirect_calls),
801628 .llvm_name = "retpoline-indirect-calls",
802629 .description = "Remove speculation of indirect calls from the generated code",
803 .dependencies = featureSet(&[_]Feature{}),
630 .dependencies = sparseFeatureSet(&[_]Feature{}),
804631 };
805632 result[@enumToInt(Feature.rtm)] = .{
806 .index = @enumToInt(Feature.rtm),
807 .name = @tagName(Feature.rtm),
808633 .llvm_name = "rtm",
809634 .description = "Support RTM instructions",
810 .dependencies = featureSet(&[_]Feature{}),
635 .dependencies = sparseFeatureSet(&[_]Feature{}),
811636 };
812637 result[@enumToInt(Feature.sahf)] = .{
813 .index = @enumToInt(Feature.sahf),
814 .name = @tagName(Feature.sahf),
815638 .llvm_name = "sahf",
816639 .description = "Support LAHF and SAHF instructions",
817 .dependencies = featureSet(&[_]Feature{}),
640 .dependencies = sparseFeatureSet(&[_]Feature{}),
818641 };
819642 result[@enumToInt(Feature.sgx)] = .{
820 .index = @enumToInt(Feature.sgx),
821 .name = @tagName(Feature.sgx),
822643 .llvm_name = "sgx",
823644 .description = "Enable Software Guard Extensions",
824 .dependencies = featureSet(&[_]Feature{}),
645 .dependencies = sparseFeatureSet(&[_]Feature{}),
825646 };
826647 result[@enumToInt(Feature.sha)] = .{
827 .index = @enumToInt(Feature.sha),
828 .name = @tagName(Feature.sha),
829648 .llvm_name = "sha",
830649 .description = "Enable SHA instructions",
831 .dependencies = featureSet(&[_]Feature{
650 .dependencies = sparseFeatureSet(&[_]Feature{
832651 .sse2,
833652 }),
834653 };
835654 result[@enumToInt(Feature.shstk)] = .{
836 .index = @enumToInt(Feature.shstk),
837 .name = @tagName(Feature.shstk),
838655 .llvm_name = "shstk",
839656 .description = "Support CET Shadow-Stack instructions",
840 .dependencies = featureSet(&[_]Feature{}),
657 .dependencies = sparseFeatureSet(&[_]Feature{}),
841658 };
842659 result[@enumToInt(Feature.slow_3ops_lea)] = .{
843 .index = @enumToInt(Feature.slow_3ops_lea),
844 .name = @tagName(Feature.slow_3ops_lea),
845660 .llvm_name = "slow-3ops-lea",
846661 .description = "LEA instruction with 3 ops or certain registers is slow",
847 .dependencies = featureSet(&[_]Feature{}),
662 .dependencies = sparseFeatureSet(&[_]Feature{}),
848663 };
849664 result[@enumToInt(Feature.slow_incdec)] = .{
850 .index = @enumToInt(Feature.slow_incdec),
851 .name = @tagName(Feature.slow_incdec),
852665 .llvm_name = "slow-incdec",
853666 .description = "INC and DEC instructions are slower than ADD and SUB",
854 .dependencies = featureSet(&[_]Feature{}),
667 .dependencies = sparseFeatureSet(&[_]Feature{}),
855668 };
856669 result[@enumToInt(Feature.slow_lea)] = .{
857 .index = @enumToInt(Feature.slow_lea),
858 .name = @tagName(Feature.slow_lea),
859670 .llvm_name = "slow-lea",
860671 .description = "LEA instruction with certain arguments is slow",
861 .dependencies = featureSet(&[_]Feature{}),
672 .dependencies = sparseFeatureSet(&[_]Feature{}),
862673 };
863674 result[@enumToInt(Feature.slow_pmaddwd)] = .{
864 .index = @enumToInt(Feature.slow_pmaddwd),
865 .name = @tagName(Feature.slow_pmaddwd),
866675 .llvm_name = "slow-pmaddwd",
867676 .description = "PMADDWD is slower than PMULLD",
868 .dependencies = featureSet(&[_]Feature{}),
677 .dependencies = sparseFeatureSet(&[_]Feature{}),
869678 };
870679 result[@enumToInt(Feature.slow_pmulld)] = .{
871 .index = @enumToInt(Feature.slow_pmulld),
872 .name = @tagName(Feature.slow_pmulld),
873680 .llvm_name = "slow-pmulld",
874681 .description = "PMULLD instruction is slow",
875 .dependencies = featureSet(&[_]Feature{}),
682 .dependencies = sparseFeatureSet(&[_]Feature{}),
876683 };
877684 result[@enumToInt(Feature.slow_shld)] = .{
878 .index = @enumToInt(Feature.slow_shld),
879 .name = @tagName(Feature.slow_shld),
880685 .llvm_name = "slow-shld",
881686 .description = "SHLD instruction is slow",
882 .dependencies = featureSet(&[_]Feature{}),
687 .dependencies = sparseFeatureSet(&[_]Feature{}),
883688 };
884689 result[@enumToInt(Feature.slow_two_mem_ops)] = .{
885 .index = @enumToInt(Feature.slow_two_mem_ops),
886 .name = @tagName(Feature.slow_two_mem_ops),
887690 .llvm_name = "slow-two-mem-ops",
888691 .description = "Two memory operand instructions are slow",
889 .dependencies = featureSet(&[_]Feature{}),
692 .dependencies = sparseFeatureSet(&[_]Feature{}),
890693 };
891694 result[@enumToInt(Feature.slow_unaligned_mem_16)] = .{
892 .index = @enumToInt(Feature.slow_unaligned_mem_16),
893 .name = @tagName(Feature.slow_unaligned_mem_16),
894695 .llvm_name = "slow-unaligned-mem-16",
895696 .description = "Slow unaligned 16-byte memory access",
896 .dependencies = featureSet(&[_]Feature{}),
697 .dependencies = sparseFeatureSet(&[_]Feature{}),
897698 };
898699 result[@enumToInt(Feature.slow_unaligned_mem_32)] = .{
899 .index = @enumToInt(Feature.slow_unaligned_mem_32),
900 .name = @tagName(Feature.slow_unaligned_mem_32),
901700 .llvm_name = "slow-unaligned-mem-32",
902701 .description = "Slow unaligned 32-byte memory access",
903 .dependencies = featureSet(&[_]Feature{}),
702 .dependencies = sparseFeatureSet(&[_]Feature{}),
904703 };
905704 result[@enumToInt(Feature.soft_float)] = .{
906 .index = @enumToInt(Feature.soft_float),
907 .name = @tagName(Feature.soft_float),
908705 .llvm_name = "soft-float",
909706 .description = "Use software floating point features",
910 .dependencies = featureSet(&[_]Feature{}),
707 .dependencies = sparseFeatureSet(&[_]Feature{}),
911708 };
912709 result[@enumToInt(Feature.sse)] = .{
913 .index = @enumToInt(Feature.sse),
914 .name = @tagName(Feature.sse),
915710 .llvm_name = "sse",
916711 .description = "Enable SSE instructions",
917 .dependencies = featureSet(&[_]Feature{}),
712 .dependencies = sparseFeatureSet(&[_]Feature{}),
918713 };
919714 result[@enumToInt(Feature.sse_unaligned_mem)] = .{
920 .index = @enumToInt(Feature.sse_unaligned_mem),
921 .name = @tagName(Feature.sse_unaligned_mem),
922715 .llvm_name = "sse-unaligned-mem",
923716 .description = "Allow unaligned memory operands with SSE instructions",
924 .dependencies = featureSet(&[_]Feature{}),
717 .dependencies = sparseFeatureSet(&[_]Feature{}),
925718 };
926719 result[@enumToInt(Feature.sse2)] = .{
927 .index = @enumToInt(Feature.sse2),
928 .name = @tagName(Feature.sse2),
929720 .llvm_name = "sse2",
930721 .description = "Enable SSE2 instructions",
931 .dependencies = featureSet(&[_]Feature{
722 .dependencies = sparseFeatureSet(&[_]Feature{
932723 .sse,
933724 }),
934725 };
935726 result[@enumToInt(Feature.sse3)] = .{
936 .index = @enumToInt(Feature.sse3),
937 .name = @tagName(Feature.sse3),
938727 .llvm_name = "sse3",
939728 .description = "Enable SSE3 instructions",
940 .dependencies = featureSet(&[_]Feature{
729 .dependencies = sparseFeatureSet(&[_]Feature{
941730 .sse2,
942731 }),
943732 };
944733 result[@enumToInt(Feature.sse4_1)] = .{
945 .index = @enumToInt(Feature.sse4_1),
946 .name = @tagName(Feature.sse4_1),
947734 .llvm_name = "sse4.1",
948735 .description = "Enable SSE 4.1 instructions",
949 .dependencies = featureSet(&[_]Feature{
736 .dependencies = sparseFeatureSet(&[_]Feature{
950737 .ssse3,
951738 }),
952739 };
953740 result[@enumToInt(Feature.sse4_2)] = .{
954 .index = @enumToInt(Feature.sse4_2),
955 .name = @tagName(Feature.sse4_2),
956741 .llvm_name = "sse4.2",
957742 .description = "Enable SSE 4.2 instructions",
958 .dependencies = featureSet(&[_]Feature{
743 .dependencies = sparseFeatureSet(&[_]Feature{
959744 .sse4_1,
960745 }),
961746 };
962747 result[@enumToInt(Feature.sse4a)] = .{
963 .index = @enumToInt(Feature.sse4a),
964 .name = @tagName(Feature.sse4a),
965748 .llvm_name = "sse4a",
966749 .description = "Support SSE 4a instructions",
967 .dependencies = featureSet(&[_]Feature{
750 .dependencies = sparseFeatureSet(&[_]Feature{
968751 .sse3,
969752 }),
970753 };
971754 result[@enumToInt(Feature.ssse3)] = .{
972 .index = @enumToInt(Feature.ssse3),
973 .name = @tagName(Feature.ssse3),
974755 .llvm_name = "ssse3",
975756 .description = "Enable SSSE3 instructions",
976 .dependencies = featureSet(&[_]Feature{
757 .dependencies = sparseFeatureSet(&[_]Feature{
977758 .sse3,
978759 }),
979760 };
980761 result[@enumToInt(Feature.tbm)] = .{
981 .index = @enumToInt(Feature.tbm),
982 .name = @tagName(Feature.tbm),
983762 .llvm_name = "tbm",
984763 .description = "Enable TBM instructions",
985 .dependencies = featureSet(&[_]Feature{}),
764 .dependencies = sparseFeatureSet(&[_]Feature{}),
986765 };
987766 result[@enumToInt(Feature.vaes)] = .{
988 .index = @enumToInt(Feature.vaes),
989 .name = @tagName(Feature.vaes),
990767 .llvm_name = "vaes",
991768 .description = "Promote selected AES instructions to AVX512/AVX registers",
992 .dependencies = featureSet(&[_]Feature{
769 .dependencies = sparseFeatureSet(&[_]Feature{
993770 .aes,
994771 .avx,
995772 }),
996773 };
997774 result[@enumToInt(Feature.vpclmulqdq)] = .{
998 .index = @enumToInt(Feature.vpclmulqdq),
999 .name = @tagName(Feature.vpclmulqdq),
1000775 .llvm_name = "vpclmulqdq",
1001776 .description = "Enable vpclmulqdq instructions",
1002 .dependencies = featureSet(&[_]Feature{
777 .dependencies = sparseFeatureSet(&[_]Feature{
1003778 .avx,
1004779 .pclmul,
1005780 }),
1006781 };
1007782 result[@enumToInt(Feature.waitpkg)] = .{
1008 .index = @enumToInt(Feature.waitpkg),
1009 .name = @tagName(Feature.waitpkg),
1010783 .llvm_name = "waitpkg",
1011784 .description = "Wait and pause enhancements",
1012 .dependencies = featureSet(&[_]Feature{}),
785 .dependencies = sparseFeatureSet(&[_]Feature{}),
1013786 };
1014787 result[@enumToInt(Feature.wbnoinvd)] = .{
1015 .index = @enumToInt(Feature.wbnoinvd),
1016 .name = @tagName(Feature.wbnoinvd),
1017788 .llvm_name = "wbnoinvd",
1018789 .description = "Write Back No Invalidate",
1019 .dependencies = featureSet(&[_]Feature{}),
790 .dependencies = sparseFeatureSet(&[_]Feature{}),
1020791 };
1021792 result[@enumToInt(Feature.x87)] = .{
1022 .index = @enumToInt(Feature.x87),
1023 .name = @tagName(Feature.x87),
1024793 .llvm_name = "x87",
1025794 .description = "Enable X87 float instructions",
1026 .dependencies = featureSet(&[_]Feature{}),
795 .dependencies = sparseFeatureSet(&[_]Feature{}),
1027796 };
1028797 result[@enumToInt(Feature.xop)] = .{
1029 .index = @enumToInt(Feature.xop),
1030 .name = @tagName(Feature.xop),
1031798 .llvm_name = "xop",
1032799 .description = "Enable XOP instructions",
1033 .dependencies = featureSet(&[_]Feature{
800 .dependencies = sparseFeatureSet(&[_]Feature{
1034801 .fma4,
1035802 }),
1036803 };
1037804 result[@enumToInt(Feature.xsave)] = .{
1038 .index = @enumToInt(Feature.xsave),
1039 .name = @tagName(Feature.xsave),
1040805 .llvm_name = "xsave",
1041806 .description = "Support xsave instructions",
1042 .dependencies = featureSet(&[_]Feature{}),
807 .dependencies = sparseFeatureSet(&[_]Feature{}),
1043808 };
1044809 result[@enumToInt(Feature.xsavec)] = .{
1045 .index = @enumToInt(Feature.xsavec),
1046 .name = @tagName(Feature.xsavec),
1047810 .llvm_name = "xsavec",
1048811 .description = "Support xsavec instructions",
1049 .dependencies = featureSet(&[_]Feature{}),
812 .dependencies = sparseFeatureSet(&[_]Feature{}),
1050813 };
1051814 result[@enumToInt(Feature.xsaveopt)] = .{
1052 .index = @enumToInt(Feature.xsaveopt),
1053 .name = @tagName(Feature.xsaveopt),
1054815 .llvm_name = "xsaveopt",
1055816 .description = "Support xsaveopt instructions",
1056 .dependencies = featureSet(&[_]Feature{}),
817 .dependencies = sparseFeatureSet(&[_]Feature{}),
1057818 };
1058819 result[@enumToInt(Feature.xsaves)] = .{
1059 .index = @enumToInt(Feature.xsaves),
1060 .name = @tagName(Feature.xsaves),
1061820 .llvm_name = "xsaves",
1062821 .description = "Support xsaves instructions",
1063 .dependencies = featureSet(&[_]Feature{}),
1064 };
822 .dependencies = sparseFeatureSet(&[_]Feature{}),
823 };
824 const ti = @typeInfo(Feature);
825 for (result) |*elem, i| {
826 elem.index = i;
827 elem.name = ti.Enum.fields[i].name;
828 elem.dependencies.initAsDependencies(i, &result);
829 }
1065830 break :blk result;
1066831};
1067832
......@@ -1069,7 +834,7 @@ pub const cpu = struct {
1069834 pub const amdfam10 = Cpu{
1070835 .name = "amdfam10",
1071836 .llvm_name = "amdfam10",
1072 .features = featureSet(&[_]Feature{
837 .features = featureSet(&all_features, &[_]Feature{
1073838 .@"3dnowa",
1074839 .@"64bit",
1075840 .cmov,
......@@ -1089,7 +854,7 @@ pub const cpu = struct {
1089854 pub const athlon = Cpu{
1090855 .name = "athlon",
1091856 .llvm_name = "athlon",
1092 .features = featureSet(&[_]Feature{
857 .features = featureSet(&all_features, &[_]Feature{
1093858 .@"3dnowa",
1094859 .cmov,
1095860 .cx8,
......@@ -1102,7 +867,7 @@ pub const cpu = struct {
1102867 pub const athlon_4 = Cpu{
1103868 .name = "athlon_4",
1104869 .llvm_name = "athlon-4",
1105 .features = featureSet(&[_]Feature{
870 .features = featureSet(&all_features, &[_]Feature{
1106871 .@"3dnowa",
1107872 .cmov,
1108873 .cx8,
......@@ -1117,7 +882,7 @@ pub const cpu = struct {
1117882 pub const athlon_fx = Cpu{
1118883 .name = "athlon_fx",
1119884 .llvm_name = "athlon-fx",
1120 .features = featureSet(&[_]Feature{
885 .features = featureSet(&all_features, &[_]Feature{
1121886 .@"3dnowa",
1122887 .@"64bit",
1123888 .cmov,
......@@ -1134,7 +899,7 @@ pub const cpu = struct {
1134899 pub const athlon_mp = Cpu{
1135900 .name = "athlon_mp",
1136901 .llvm_name = "athlon-mp",
1137 .features = featureSet(&[_]Feature{
902 .features = featureSet(&all_features, &[_]Feature{
1138903 .@"3dnowa",
1139904 .cmov,
1140905 .cx8,
......@@ -1149,7 +914,7 @@ pub const cpu = struct {
1149914 pub const athlon_tbird = Cpu{
1150915 .name = "athlon_tbird",
1151916 .llvm_name = "athlon-tbird",
1152 .features = featureSet(&[_]Feature{
917 .features = featureSet(&all_features, &[_]Feature{
1153918 .@"3dnowa",
1154919 .cmov,
1155920 .cx8,
......@@ -1162,7 +927,7 @@ pub const cpu = struct {
1162927 pub const athlon_xp = Cpu{
1163928 .name = "athlon_xp",
1164929 .llvm_name = "athlon-xp",
1165 .features = featureSet(&[_]Feature{
930 .features = featureSet(&all_features, &[_]Feature{
1166931 .@"3dnowa",
1167932 .cmov,
1168933 .cx8,
......@@ -1177,7 +942,7 @@ pub const cpu = struct {
1177942 pub const athlon64 = Cpu{
1178943 .name = "athlon64",
1179944 .llvm_name = "athlon64",
1180 .features = featureSet(&[_]Feature{
945 .features = featureSet(&all_features, &[_]Feature{
1181946 .@"3dnowa",
1182947 .@"64bit",
1183948 .cmov,
......@@ -1194,7 +959,7 @@ pub const cpu = struct {
1194959 pub const athlon64_sse3 = Cpu{
1195960 .name = "athlon64_sse3",
1196961 .llvm_name = "athlon64-sse3",
1197 .features = featureSet(&[_]Feature{
962 .features = featureSet(&all_features, &[_]Feature{
1198963 .@"3dnowa",
1199964 .@"64bit",
1200965 .cmov,
......@@ -1212,7 +977,7 @@ pub const cpu = struct {
1212977 pub const atom = Cpu{
1213978 .name = "atom",
1214979 .llvm_name = "atom",
1215 .features = featureSet(&[_]Feature{
980 .features = featureSet(&all_features, &[_]Feature{
1216981 .@"64bit",
1217982 .cmov,
1218983 .cx16,
......@@ -1236,7 +1001,7 @@ pub const cpu = struct {
12361001 pub const barcelona = Cpu{
12371002 .name = "barcelona",
12381003 .llvm_name = "barcelona",
1239 .features = featureSet(&[_]Feature{
1004 .features = featureSet(&all_features, &[_]Feature{
12401005 .@"3dnowa",
12411006 .@"64bit",
12421007 .cmov,
......@@ -1256,7 +1021,7 @@ pub const cpu = struct {
12561021 pub const bdver1 = Cpu{
12571022 .name = "bdver1",
12581023 .llvm_name = "bdver1",
1259 .features = featureSet(&[_]Feature{
1024 .features = featureSet(&all_features, &[_]Feature{
12601025 .@"64bit",
12611026 .aes,
12621027 .branchfusion,
......@@ -1283,7 +1048,7 @@ pub const cpu = struct {
12831048 pub const bdver2 = Cpu{
12841049 .name = "bdver2",
12851050 .llvm_name = "bdver2",
1286 .features = featureSet(&[_]Feature{
1051 .features = featureSet(&all_features, &[_]Feature{
12871052 .@"64bit",
12881053 .aes,
12891054 .bmi,
......@@ -1315,7 +1080,7 @@ pub const cpu = struct {
13151080 pub const bdver3 = Cpu{
13161081 .name = "bdver3",
13171082 .llvm_name = "bdver3",
1318 .features = featureSet(&[_]Feature{
1083 .features = featureSet(&all_features, &[_]Feature{
13191084 .@"64bit",
13201085 .aes,
13211086 .bmi,
......@@ -1349,7 +1114,7 @@ pub const cpu = struct {
13491114 pub const bdver4 = Cpu{
13501115 .name = "bdver4",
13511116 .llvm_name = "bdver4",
1352 .features = featureSet(&[_]Feature{
1117 .features = featureSet(&all_features, &[_]Feature{
13531118 .@"64bit",
13541119 .aes,
13551120 .avx2,
......@@ -1386,7 +1151,7 @@ pub const cpu = struct {
13861151 pub const bonnell = Cpu{
13871152 .name = "bonnell",
13881153 .llvm_name = "bonnell",
1389 .features = featureSet(&[_]Feature{
1154 .features = featureSet(&all_features, &[_]Feature{
13901155 .@"64bit",
13911156 .cmov,
13921157 .cx16,
......@@ -1410,7 +1175,7 @@ pub const cpu = struct {
14101175 pub const broadwell = Cpu{
14111176 .name = "broadwell",
14121177 .llvm_name = "broadwell",
1413 .features = featureSet(&[_]Feature{
1178 .features = featureSet(&all_features, &[_]Feature{
14141179 .@"64bit",
14151180 .adx,
14161181 .avx,
......@@ -1454,7 +1219,7 @@ pub const cpu = struct {
14541219 pub const btver1 = Cpu{
14551220 .name = "btver1",
14561221 .llvm_name = "btver1",
1457 .features = featureSet(&[_]Feature{
1222 .features = featureSet(&all_features, &[_]Feature{
14581223 .@"64bit",
14591224 .cmov,
14601225 .cx16,
......@@ -1478,7 +1243,7 @@ pub const cpu = struct {
14781243 pub const btver2 = Cpu{
14791244 .name = "btver2",
14801245 .llvm_name = "btver2",
1481 .features = featureSet(&[_]Feature{
1246 .features = featureSet(&all_features, &[_]Feature{
14821247 .@"64bit",
14831248 .aes,
14841249 .avx,
......@@ -1514,7 +1279,7 @@ pub const cpu = struct {
15141279 pub const c3 = Cpu{
15151280 .name = "c3",
15161281 .llvm_name = "c3",
1517 .features = featureSet(&[_]Feature{
1282 .features = featureSet(&all_features, &[_]Feature{
15181283 .@"3dnow",
15191284 .slow_unaligned_mem_16,
15201285 .x87,
......@@ -1523,7 +1288,7 @@ pub const cpu = struct {
15231288 pub const c3_2 = Cpu{
15241289 .name = "c3_2",
15251290 .llvm_name = "c3-2",
1526 .features = featureSet(&[_]Feature{
1291 .features = featureSet(&all_features, &[_]Feature{
15271292 .cmov,
15281293 .cx8,
15291294 .fxsr,
......@@ -1536,7 +1301,7 @@ pub const cpu = struct {
15361301 pub const cannonlake = Cpu{
15371302 .name = "cannonlake",
15381303 .llvm_name = "cannonlake",
1539 .features = featureSet(&[_]Feature{
1304 .features = featureSet(&all_features, &[_]Feature{
15401305 .@"64bit",
15411306 .adx,
15421307 .aes,
......@@ -1595,7 +1360,7 @@ pub const cpu = struct {
15951360 pub const cascadelake = Cpu{
15961361 .name = "cascadelake",
15971362 .llvm_name = "cascadelake",
1598 .features = featureSet(&[_]Feature{
1363 .features = featureSet(&all_features, &[_]Feature{
15991364 .@"64bit",
16001365 .adx,
16011366 .aes,
......@@ -1653,7 +1418,7 @@ pub const cpu = struct {
16531418 pub const cooperlake = Cpu{
16541419 .name = "cooperlake",
16551420 .llvm_name = "cooperlake",
1656 .features = featureSet(&[_]Feature{
1421 .features = featureSet(&all_features, &[_]Feature{
16571422 .@"64bit",
16581423 .adx,
16591424 .aes,
......@@ -1712,7 +1477,7 @@ pub const cpu = struct {
17121477 pub const core_avx_i = Cpu{
17131478 .name = "core_avx_i",
17141479 .llvm_name = "core-avx-i",
1715 .features = featureSet(&[_]Feature{
1480 .features = featureSet(&all_features, &[_]Feature{
17161481 .@"64bit",
17171482 .avx,
17181483 .cmov,
......@@ -1744,7 +1509,7 @@ pub const cpu = struct {
17441509 pub const core_avx2 = Cpu{
17451510 .name = "core_avx2",
17461511 .llvm_name = "core-avx2",
1747 .features = featureSet(&[_]Feature{
1512 .features = featureSet(&all_features, &[_]Feature{
17481513 .@"64bit",
17491514 .avx,
17501515 .avx2,
......@@ -1785,7 +1550,7 @@ pub const cpu = struct {
17851550 pub const core2 = Cpu{
17861551 .name = "core2",
17871552 .llvm_name = "core2",
1788 .features = featureSet(&[_]Feature{
1553 .features = featureSet(&all_features, &[_]Feature{
17891554 .@"64bit",
17901555 .cmov,
17911556 .cx16,
......@@ -1803,7 +1568,7 @@ pub const cpu = struct {
18031568 pub const corei7 = Cpu{
18041569 .name = "corei7",
18051570 .llvm_name = "corei7",
1806 .features = featureSet(&[_]Feature{
1571 .features = featureSet(&all_features, &[_]Feature{
18071572 .@"64bit",
18081573 .cmov,
18091574 .cx16,
......@@ -1821,7 +1586,7 @@ pub const cpu = struct {
18211586 pub const corei7_avx = Cpu{
18221587 .name = "corei7_avx",
18231588 .llvm_name = "corei7-avx",
1824 .features = featureSet(&[_]Feature{
1589 .features = featureSet(&all_features, &[_]Feature{
18251590 .@"64bit",
18261591 .avx,
18271592 .cmov,
......@@ -1850,7 +1615,7 @@ pub const cpu = struct {
18501615 pub const generic = Cpu{
18511616 .name = "generic",
18521617 .llvm_name = "generic",
1853 .features = featureSet(&[_]Feature{
1618 .features = featureSet(&all_features, &[_]Feature{
18541619 .cx8,
18551620 .slow_unaligned_mem_16,
18561621 .x87,
......@@ -1859,7 +1624,7 @@ pub const cpu = struct {
18591624 pub const geode = Cpu{
18601625 .name = "geode",
18611626 .llvm_name = "geode",
1862 .features = featureSet(&[_]Feature{
1627 .features = featureSet(&all_features, &[_]Feature{
18631628 .@"3dnowa",
18641629 .cx8,
18651630 .slow_unaligned_mem_16,
......@@ -1869,7 +1634,7 @@ pub const cpu = struct {
18691634 pub const goldmont = Cpu{
18701635 .name = "goldmont",
18711636 .llvm_name = "goldmont",
1872 .features = featureSet(&[_]Feature{
1637 .features = featureSet(&all_features, &[_]Feature{
18731638 .@"64bit",
18741639 .aes,
18751640 .clflushopt,
......@@ -1905,7 +1670,7 @@ pub const cpu = struct {
19051670 pub const goldmont_plus = Cpu{
19061671 .name = "goldmont_plus",
19071672 .llvm_name = "goldmont-plus",
1908 .features = featureSet(&[_]Feature{
1673 .features = featureSet(&all_features, &[_]Feature{
19091674 .@"64bit",
19101675 .aes,
19111676 .clflushopt,
......@@ -1943,7 +1708,7 @@ pub const cpu = struct {
19431708 pub const haswell = Cpu{
19441709 .name = "haswell",
19451710 .llvm_name = "haswell",
1946 .features = featureSet(&[_]Feature{
1711 .features = featureSet(&all_features, &[_]Feature{
19471712 .@"64bit",
19481713 .avx,
19491714 .avx2,
......@@ -1984,7 +1749,7 @@ pub const cpu = struct {
19841749 pub const _i386 = Cpu{
19851750 .name = "_i386",
19861751 .llvm_name = "i386",
1987 .features = featureSet(&[_]Feature{
1752 .features = featureSet(&all_features, &[_]Feature{
19881753 .slow_unaligned_mem_16,
19891754 .x87,
19901755 }),
......@@ -1992,7 +1757,7 @@ pub const cpu = struct {
19921757 pub const _i486 = Cpu{
19931758 .name = "_i486",
19941759 .llvm_name = "i486",
1995 .features = featureSet(&[_]Feature{
1760 .features = featureSet(&all_features, &[_]Feature{
19961761 .slow_unaligned_mem_16,
19971762 .x87,
19981763 }),
......@@ -2000,7 +1765,7 @@ pub const cpu = struct {
20001765 pub const _i586 = Cpu{
20011766 .name = "_i586",
20021767 .llvm_name = "i586",
2003 .features = featureSet(&[_]Feature{
1768 .features = featureSet(&all_features, &[_]Feature{
20041769 .cx8,
20051770 .slow_unaligned_mem_16,
20061771 .x87,
......@@ -2009,7 +1774,7 @@ pub const cpu = struct {
20091774 pub const _i686 = Cpu{
20101775 .name = "_i686",
20111776 .llvm_name = "i686",
2012 .features = featureSet(&[_]Feature{
1777 .features = featureSet(&all_features, &[_]Feature{
20131778 .cmov,
20141779 .cx8,
20151780 .slow_unaligned_mem_16,
......@@ -2019,7 +1784,7 @@ pub const cpu = struct {
20191784 pub const icelake_client = Cpu{
20201785 .name = "icelake_client",
20211786 .llvm_name = "icelake-client",
2022 .features = featureSet(&[_]Feature{
1787 .features = featureSet(&all_features, &[_]Feature{
20231788 .@"64bit",
20241789 .adx,
20251790 .aes,
......@@ -2087,7 +1852,7 @@ pub const cpu = struct {
20871852 pub const icelake_server = Cpu{
20881853 .name = "icelake_server",
20891854 .llvm_name = "icelake-server",
2090 .features = featureSet(&[_]Feature{
1855 .features = featureSet(&all_features, &[_]Feature{
20911856 .@"64bit",
20921857 .adx,
20931858 .aes,
......@@ -2157,7 +1922,7 @@ pub const cpu = struct {
21571922 pub const ivybridge = Cpu{
21581923 .name = "ivybridge",
21591924 .llvm_name = "ivybridge",
2160 .features = featureSet(&[_]Feature{
1925 .features = featureSet(&all_features, &[_]Feature{
21611926 .@"64bit",
21621927 .avx,
21631928 .cmov,
......@@ -2189,7 +1954,7 @@ pub const cpu = struct {
21891954 pub const k6 = Cpu{
21901955 .name = "k6",
21911956 .llvm_name = "k6",
2192 .features = featureSet(&[_]Feature{
1957 .features = featureSet(&all_features, &[_]Feature{
21931958 .cx8,
21941959 .mmx,
21951960 .slow_unaligned_mem_16,
......@@ -2199,7 +1964,7 @@ pub const cpu = struct {
21991964 pub const k6_2 = Cpu{
22001965 .name = "k6_2",
22011966 .llvm_name = "k6-2",
2202 .features = featureSet(&[_]Feature{
1967 .features = featureSet(&all_features, &[_]Feature{
22031968 .@"3dnow",
22041969 .cx8,
22051970 .slow_unaligned_mem_16,
......@@ -2209,7 +1974,7 @@ pub const cpu = struct {
22091974 pub const k6_3 = Cpu{
22101975 .name = "k6_3",
22111976 .llvm_name = "k6-3",
2212 .features = featureSet(&[_]Feature{
1977 .features = featureSet(&all_features, &[_]Feature{
22131978 .@"3dnow",
22141979 .cx8,
22151980 .slow_unaligned_mem_16,
......@@ -2219,7 +1984,7 @@ pub const cpu = struct {
22191984 pub const k8 = Cpu{
22201985 .name = "k8",
22211986 .llvm_name = "k8",
2222 .features = featureSet(&[_]Feature{
1987 .features = featureSet(&all_features, &[_]Feature{
22231988 .@"3dnowa",
22241989 .@"64bit",
22251990 .cmov,
......@@ -2236,7 +2001,7 @@ pub const cpu = struct {
22362001 pub const k8_sse3 = Cpu{
22372002 .name = "k8_sse3",
22382003 .llvm_name = "k8-sse3",
2239 .features = featureSet(&[_]Feature{
2004 .features = featureSet(&all_features, &[_]Feature{
22402005 .@"3dnowa",
22412006 .@"64bit",
22422007 .cmov,
......@@ -2254,7 +2019,7 @@ pub const cpu = struct {
22542019 pub const knl = Cpu{
22552020 .name = "knl",
22562021 .llvm_name = "knl",
2257 .features = featureSet(&[_]Feature{
2022 .features = featureSet(&all_features, &[_]Feature{
22582023 .@"64bit",
22592024 .adx,
22602025 .aes,
......@@ -2297,7 +2062,7 @@ pub const cpu = struct {
22972062 pub const knm = Cpu{
22982063 .name = "knm",
22992064 .llvm_name = "knm",
2300 .features = featureSet(&[_]Feature{
2065 .features = featureSet(&all_features, &[_]Feature{
23012066 .@"64bit",
23022067 .adx,
23032068 .aes,
......@@ -2341,12 +2106,12 @@ pub const cpu = struct {
23412106 pub const lakemont = Cpu{
23422107 .name = "lakemont",
23432108 .llvm_name = "lakemont",
2344 .features = featureSet(&[_]Feature{}),
2109 .features = featureSet(&all_features, &[_]Feature{}),
23452110 };
23462111 pub const nehalem = Cpu{
23472112 .name = "nehalem",
23482113 .llvm_name = "nehalem",
2349 .features = featureSet(&[_]Feature{
2114 .features = featureSet(&all_features, &[_]Feature{
23502115 .@"64bit",
23512116 .cmov,
23522117 .cx16,
......@@ -2364,7 +2129,7 @@ pub const cpu = struct {
23642129 pub const nocona = Cpu{
23652130 .name = "nocona",
23662131 .llvm_name = "nocona",
2367 .features = featureSet(&[_]Feature{
2132 .features = featureSet(&all_features, &[_]Feature{
23682133 .@"64bit",
23692134 .cmov,
23702135 .cx16,
......@@ -2380,7 +2145,7 @@ pub const cpu = struct {
23802145 pub const opteron = Cpu{
23812146 .name = "opteron",
23822147 .llvm_name = "opteron",
2383 .features = featureSet(&[_]Feature{
2148 .features = featureSet(&all_features, &[_]Feature{
23842149 .@"3dnowa",
23852150 .@"64bit",
23862151 .cmov,
......@@ -2397,7 +2162,7 @@ pub const cpu = struct {
23972162 pub const opteron_sse3 = Cpu{
23982163 .name = "opteron_sse3",
23992164 .llvm_name = "opteron-sse3",
2400 .features = featureSet(&[_]Feature{
2165 .features = featureSet(&all_features, &[_]Feature{
24012166 .@"3dnowa",
24022167 .@"64bit",
24032168 .cmov,
......@@ -2415,7 +2180,7 @@ pub const cpu = struct {
24152180 pub const penryn = Cpu{
24162181 .name = "penryn",
24172182 .llvm_name = "penryn",
2418 .features = featureSet(&[_]Feature{
2183 .features = featureSet(&all_features, &[_]Feature{
24192184 .@"64bit",
24202185 .cmov,
24212186 .cx16,
......@@ -2433,7 +2198,7 @@ pub const cpu = struct {
24332198 pub const pentium = Cpu{
24342199 .name = "pentium",
24352200 .llvm_name = "pentium",
2436 .features = featureSet(&[_]Feature{
2201 .features = featureSet(&all_features, &[_]Feature{
24372202 .cx8,
24382203 .slow_unaligned_mem_16,
24392204 .x87,
......@@ -2442,7 +2207,7 @@ pub const cpu = struct {
24422207 pub const pentium_m = Cpu{
24432208 .name = "pentium_m",
24442209 .llvm_name = "pentium-m",
2445 .features = featureSet(&[_]Feature{
2210 .features = featureSet(&all_features, &[_]Feature{
24462211 .cmov,
24472212 .cx8,
24482213 .fxsr,
......@@ -2456,7 +2221,7 @@ pub const cpu = struct {
24562221 pub const pentium_mmx = Cpu{
24572222 .name = "pentium_mmx",
24582223 .llvm_name = "pentium-mmx",
2459 .features = featureSet(&[_]Feature{
2224 .features = featureSet(&all_features, &[_]Feature{
24602225 .cx8,
24612226 .mmx,
24622227 .slow_unaligned_mem_16,
......@@ -2466,7 +2231,7 @@ pub const cpu = struct {
24662231 pub const pentium2 = Cpu{
24672232 .name = "pentium2",
24682233 .llvm_name = "pentium2",
2469 .features = featureSet(&[_]Feature{
2234 .features = featureSet(&all_features, &[_]Feature{
24702235 .cmov,
24712236 .cx8,
24722237 .fxsr,
......@@ -2479,7 +2244,7 @@ pub const cpu = struct {
24792244 pub const pentium3 = Cpu{
24802245 .name = "pentium3",
24812246 .llvm_name = "pentium3",
2482 .features = featureSet(&[_]Feature{
2247 .features = featureSet(&all_features, &[_]Feature{
24832248 .cmov,
24842249 .cx8,
24852250 .fxsr,
......@@ -2493,7 +2258,7 @@ pub const cpu = struct {
24932258 pub const pentium3m = Cpu{
24942259 .name = "pentium3m",
24952260 .llvm_name = "pentium3m",
2496 .features = featureSet(&[_]Feature{
2261 .features = featureSet(&all_features, &[_]Feature{
24972262 .cmov,
24982263 .cx8,
24992264 .fxsr,
......@@ -2507,7 +2272,7 @@ pub const cpu = struct {
25072272 pub const pentium4 = Cpu{
25082273 .name = "pentium4",
25092274 .llvm_name = "pentium4",
2510 .features = featureSet(&[_]Feature{
2275 .features = featureSet(&all_features, &[_]Feature{
25112276 .cmov,
25122277 .cx8,
25132278 .fxsr,
......@@ -2521,7 +2286,7 @@ pub const cpu = struct {
25212286 pub const pentium4m = Cpu{
25222287 .name = "pentium4m",
25232288 .llvm_name = "pentium4m",
2524 .features = featureSet(&[_]Feature{
2289 .features = featureSet(&all_features, &[_]Feature{
25252290 .cmov,
25262291 .cx8,
25272292 .fxsr,
......@@ -2535,7 +2300,7 @@ pub const cpu = struct {
25352300 pub const pentiumpro = Cpu{
25362301 .name = "pentiumpro",
25372302 .llvm_name = "pentiumpro",
2538 .features = featureSet(&[_]Feature{
2303 .features = featureSet(&all_features, &[_]Feature{
25392304 .cmov,
25402305 .cx8,
25412306 .nopl,
......@@ -2546,7 +2311,7 @@ pub const cpu = struct {
25462311 pub const prescott = Cpu{
25472312 .name = "prescott",
25482313 .llvm_name = "prescott",
2549 .features = featureSet(&[_]Feature{
2314 .features = featureSet(&all_features, &[_]Feature{
25502315 .cmov,
25512316 .cx8,
25522317 .fxsr,
......@@ -2560,7 +2325,7 @@ pub const cpu = struct {
25602325 pub const sandybridge = Cpu{
25612326 .name = "sandybridge",
25622327 .llvm_name = "sandybridge",
2563 .features = featureSet(&[_]Feature{
2328 .features = featureSet(&all_features, &[_]Feature{
25642329 .@"64bit",
25652330 .avx,
25662331 .cmov,
......@@ -2589,7 +2354,7 @@ pub const cpu = struct {
25892354 pub const silvermont = Cpu{
25902355 .name = "silvermont",
25912356 .llvm_name = "silvermont",
2592 .features = featureSet(&[_]Feature{
2357 .features = featureSet(&all_features, &[_]Feature{
25932358 .@"64bit",
25942359 .cmov,
25952360 .cx16,
......@@ -2617,7 +2382,7 @@ pub const cpu = struct {
26172382 pub const skx = Cpu{
26182383 .name = "skx",
26192384 .llvm_name = "skx",
2620 .features = featureSet(&[_]Feature{
2385 .features = featureSet(&all_features, &[_]Feature{
26212386 .@"64bit",
26222387 .adx,
26232388 .aes,
......@@ -2674,7 +2439,7 @@ pub const cpu = struct {
26742439 pub const skylake = Cpu{
26752440 .name = "skylake",
26762441 .llvm_name = "skylake",
2677 .features = featureSet(&[_]Feature{
2442 .features = featureSet(&all_features, &[_]Feature{
26782443 .@"64bit",
26792444 .adx,
26802445 .aes,
......@@ -2725,7 +2490,7 @@ pub const cpu = struct {
27252490 pub const skylake_avx512 = Cpu{
27262491 .name = "skylake_avx512",
27272492 .llvm_name = "skylake-avx512",
2728 .features = featureSet(&[_]Feature{
2493 .features = featureSet(&all_features, &[_]Feature{
27292494 .@"64bit",
27302495 .adx,
27312496 .aes,
......@@ -2782,7 +2547,7 @@ pub const cpu = struct {
27822547 pub const slm = Cpu{
27832548 .name = "slm",
27842549 .llvm_name = "slm",
2785 .features = featureSet(&[_]Feature{
2550 .features = featureSet(&all_features, &[_]Feature{
27862551 .@"64bit",
27872552 .cmov,
27882553 .cx16,
......@@ -2810,7 +2575,7 @@ pub const cpu = struct {
28102575 pub const tremont = Cpu{
28112576 .name = "tremont",
28122577 .llvm_name = "tremont",
2813 .features = featureSet(&[_]Feature{
2578 .features = featureSet(&all_features, &[_]Feature{
28142579 .@"64bit",
28152580 .aes,
28162581 .cldemote,
......@@ -2853,7 +2618,7 @@ pub const cpu = struct {
28532618 pub const westmere = Cpu{
28542619 .name = "westmere",
28552620 .llvm_name = "westmere",
2856 .features = featureSet(&[_]Feature{
2621 .features = featureSet(&all_features, &[_]Feature{
28572622 .@"64bit",
28582623 .cmov,
28592624 .cx16,
......@@ -2872,7 +2637,7 @@ pub const cpu = struct {
28722637 pub const winchip_c6 = Cpu{
28732638 .name = "winchip_c6",
28742639 .llvm_name = "winchip-c6",
2875 .features = featureSet(&[_]Feature{
2640 .features = featureSet(&all_features, &[_]Feature{
28762641 .mmx,
28772642 .slow_unaligned_mem_16,
28782643 .x87,
......@@ -2881,7 +2646,7 @@ pub const cpu = struct {
28812646 pub const winchip2 = Cpu{
28822647 .name = "winchip2",
28832648 .llvm_name = "winchip2",
2884 .features = featureSet(&[_]Feature{
2649 .features = featureSet(&all_features, &[_]Feature{
28852650 .@"3dnow",
28862651 .slow_unaligned_mem_16,
28872652 .x87,
......@@ -2890,7 +2655,7 @@ pub const cpu = struct {
28902655 pub const x86_64 = Cpu{
28912656 .name = "x86_64",
28922657 .llvm_name = "x86-64",
2893 .features = featureSet(&[_]Feature{
2658 .features = featureSet(&all_features, &[_]Feature{
28942659 .@"64bit",
28952660 .cmov,
28962661 .cx8,
......@@ -2907,7 +2672,7 @@ pub const cpu = struct {
29072672 pub const yonah = Cpu{
29082673 .name = "yonah",
29092674 .llvm_name = "yonah",
2910 .features = featureSet(&[_]Feature{
2675 .features = featureSet(&all_features, &[_]Feature{
29112676 .cmov,
29122677 .cx8,
29132678 .fxsr,
......@@ -2921,7 +2686,7 @@ pub const cpu = struct {
29212686 pub const znver1 = Cpu{
29222687 .name = "znver1",
29232688 .llvm_name = "znver1",
2924 .features = featureSet(&[_]Feature{
2689 .features = featureSet(&all_features, &[_]Feature{
29252690 .@"64bit",
29262691 .adx,
29272692 .aes,
......@@ -2965,7 +2730,7 @@ pub const cpu = struct {
29652730 pub const znver2 = Cpu{
29662731 .name = "znver2",
29672732 .llvm_name = "znver2",
2968 .features = featureSet(&[_]Feature{
2733 .features = featureSet(&all_features, &[_]Feature{
29692734 .@"64bit",
29702735 .adx,
29712736 .aes,
src-self-hosted/stage1.zig+9-6
......@@ -581,8 +581,8 @@ fn cpuFeaturesFromLLVM(
581581 const this_llvm_name = feature.llvm_name orelse continue;
582582 if (mem.eql(u8, llvm_feat, this_llvm_name)) {
583583 switch (op) {
584 .add => set.addFeature(@intCast(u8, index)),
585 .sub => set.removeFeature(@intCast(u8, index)),
584 .add => set.addSparseFeature(@intCast(u8, index)),
585 .sub => set.removeSparseFeature(@intCast(u8, index)),
586586 }
587587 break;
588588 }
......@@ -676,7 +676,7 @@ const Stage2CpuFeatures = struct {
676676 });
677677 errdefer allocator.free(builtin_str);
678678
679 const cache_hash = try std.fmt.allocPrint0(allocator, "{}\n{x}", .{ cpu.name, cpu.features.bytes });
679 const cache_hash = try std.fmt.allocPrint0(allocator, "{}\n{}", .{ cpu.name, cpu.features.asBytes() });
680680 errdefer allocator.free(cache_hash);
681681
682682 self.* = Self{
......@@ -699,10 +699,13 @@ const Stage2CpuFeatures = struct {
699699 defer llvm_features_buffer.deinit();
700700
701701 const all_features = arch.allFeaturesList();
702 var populated_feature_set = feature_set;
703 if (arch.subArchFeature()) |sub_arch_index| {
704 populated_feature_set.addFeature(sub_arch_index, all_features);
705 }
702706 for (all_features) |feature, index| {
703707 const llvm_name = feature.llvm_name orelse continue;
704
705 const plus_or_minus = "-+"[@boolToInt(feature_set.isEnabled(@intCast(u8, index)))];
708 const plus_or_minus = "-+"[@boolToInt(populated_feature_set.isEnabled(@intCast(u8, index)))];
706709 try llvm_features_buffer.appendByte(plus_or_minus);
707710 try llvm_features_buffer.append(llvm_name);
708711 try llvm_features_buffer.append(",");
......@@ -721,7 +724,7 @@ const Stage2CpuFeatures = struct {
721724 const self = try allocator.create(Self);
722725 errdefer allocator.destroy(self);
723726
724 const cache_hash = try std.fmt.allocPrint0(allocator, "\n{}", .{feature_set.bytes});
727 const cache_hash = try std.fmt.allocPrint0(allocator, "\n{}", .{feature_set.asBytes()});
725728 errdefer allocator.free(cache_hash);
726729
727730 const generic_arch_name = arch.genericName();
src/all_types.hpp+1
......@@ -2144,6 +2144,7 @@ struct CodeGen {
21442144 bool verbose_llvm_ir;
21452145 bool verbose_cimport;
21462146 bool verbose_cc;
2147 bool verbose_llvm_cpu_features;
21472148 bool error_during_imports;
21482149 bool generate_error_name_table;
21492150 bool enable_cache; // mutually exclusive with output_dir
src/codegen.cpp+4-2
......@@ -8802,8 +8802,10 @@ static void init(CodeGen *g) {
88028802 target_specific_cpu_args = stage2_cpu_features_get_llvm_cpu(g->zig_target->cpu_features);
88038803 target_specific_features = stage2_cpu_features_get_llvm_features(g->zig_target->cpu_features);
88048804 }
8805 //fprintf(stderr, "name=%s target_specific_cpu_args=%s\n", buf_ptr(g->root_out_name), target_specific_cpu_args);
8806 //fprintf(stderr, "name=%s target_specific_features=%s\n", buf_ptr(g->root_out_name), target_specific_features);
8805 if (g->verbose_llvm_cpu_features) {
8806 fprintf(stderr, "name=%s target_specific_cpu_args=%s\n", buf_ptr(g->root_out_name), target_specific_cpu_args);
8807 fprintf(stderr, "name=%s target_specific_features=%s\n", buf_ptr(g->root_out_name), target_specific_features);
8808 }
88078809
88088810 g->target_machine = ZigLLVMCreateTargetMachine(target_ref, buf_ptr(&g->llvm_triple_str),
88098811 target_specific_cpu_args, target_specific_features, opt_level, reloc_mode,
src/main.cpp+5
......@@ -93,6 +93,7 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) {
9393 " --verbose-llvm-ir enable compiler debug output for LLVM IR\n"
9494 " --verbose-cimport enable compiler debug output for C imports\n"
9595 " --verbose-cc enable compiler debug output for C compilation\n"
96 " --verbose-llvm-cpu-features enable compiler debug output for LLVM CPU features\n"
9697 " -dirafter [dir] add directory to AFTER include search path\n"
9798 " -isystem [dir] add directory to SYSTEM include search path\n"
9899 " -I[dir] add directory to include search path\n"
......@@ -398,6 +399,7 @@ int main(int argc, char **argv) {
398399 bool verbose_llvm_ir = false;
399400 bool verbose_cimport = false;
400401 bool verbose_cc = false;
402 bool verbose_llvm_cpu_features = false;
401403 bool link_eh_frame_hdr = false;
402404 ErrColor color = ErrColorAuto;
403405 CacheOpt enable_cache = CacheOptAuto;
......@@ -614,6 +616,8 @@ int main(int argc, char **argv) {
614616 verbose_cimport = true;
615617 } else if (strcmp(arg, "--verbose-cc") == 0) {
616618 verbose_cc = true;
619 } else if (strcmp(arg, "--verbose-llvm-cpu-features") == 0) {
620 verbose_llvm_cpu_features = true;
617621 } else if (strcmp(arg, "-rdynamic") == 0) {
618622 rdynamic = true;
619623 } else if (strcmp(arg, "--each-lib-rpath") == 0) {
......@@ -1184,6 +1188,7 @@ int main(int argc, char **argv) {
11841188 g->verbose_llvm_ir = verbose_llvm_ir;
11851189 g->verbose_cimport = verbose_cimport;
11861190 g->verbose_cc = verbose_cc;
1191 g->verbose_llvm_cpu_features = verbose_llvm_cpu_features;
11871192 g->output_dir = output_dir;
11881193 g->disable_gen_h = disable_gen_h;
11891194 g->bundle_compiler_rt = bundle_compiler_rt;