Commit 33c69d5cb6

Andrew Kelley <andrew@ziglang.org>
2020-02-20 21:27:42
arm: clarify which CPU features are sub-architectures
versus which ones are instruction sets.
1 parent 9c3eff9
Changed files (2)
lib
lib/std/target/arm.zig
@@ -9,39 +9,6 @@ pub const Feature = enum {
     aclass,
     acquire_release,
     aes,
-    armv2,
-    armv2a,
-    armv3,
-    armv3m,
-    armv4,
-    armv4t,
-    armv5t,
-    armv5te,
-    armv5tej,
-    armv6,
-    armv6_m,
-    armv6j,
-    armv6k,
-    armv6kz,
-    armv6s_m,
-    armv6t2,
-    armv7_a,
-    armv7_m,
-    armv7_r,
-    armv7e_m,
-    armv7k,
-    armv7s,
-    armv7ve,
-    armv8_a,
-    armv8_m_base,
-    armv8_m_main,
-    armv8_r,
-    armv8_1_a,
-    armv8_1_m_main,
-    armv8_2_a,
-    armv8_3_a,
-    armv8_4_a,
-    armv8_5_a,
     avoid_movs_shop,
     avoid_partial_cpsr,
     cheap_predicable_cpsr,
@@ -57,13 +24,13 @@ pub const Feature = enum {
     execute_only,
     expand_fp_mlx,
     exynos,
+    fp16,
+    fp16fml,
+    fp64,
     fp_armv8,
     fp_armv8d16,
     fp_armv8d16sp,
     fp_armv8sp,
-    fp16,
-    fp16fml,
-    fp64,
     fpao,
     fpregs,
     fpregs16,
@@ -71,6 +38,24 @@ pub const Feature = enum {
     fullfp16,
     fuse_aes,
     fuse_literals,
+    has_v4t,
+    has_v5t,
+    has_v5te,
+    has_v6,
+    has_v6k,
+    has_v6m,
+    has_v6t2,
+    has_v7,
+    has_v7clrex,
+    has_v8_1a,
+    has_v8_1m_main,
+    has_v8_2a,
+    has_v8_3a,
+    has_v8_4a,
+    has_v8_5a,
+    has_v8,
+    has_v8m,
+    has_v8m_main,
     hwdiv,
     hwdiv_arm,
     iwmmxt,
@@ -115,29 +100,44 @@ pub const Feature = enum {
     splat_vfp_neon,
     strict_align,
     swift,
-    thumb_mode,
     thumb2,
+    thumb_mode,
     trustzone,
     use_aa,
     use_misched,
+    v2,
+    v2a,
+    v3,
+    v3m,
+    v4,
     v4t,
     v5t,
     v5te,
+    v5tej,
     v6,
+    v6j,
     v6k,
+    v6kz,
     v6m,
+    v6sm,
     v6t2,
-    v7,
-    v7clrex,
+    v7a,
+    v7em,
+    v7k,
+    v7m,
+    v7r,
+    v7s,
+    v7ve,
     v8a,
+    v8m,
+    v8m_main,
+    v8r,
     v8_1a,
     v8_1m_main,
     v8_2a,
     v8_3a,
     v8_4a,
     v8_5a,
-    v8m,
-    v8m_main,
     vfp2,
     vfp2d16,
     vfp2d16sp,
@@ -171,393 +171,31 @@ pub const all_features = blk: {
         .description = "Prefer 32-bit Thumb instrs",
         .dependencies = featureSet(&[_]Feature{}),
     };
-    result[@enumToInt(Feature.@"8msecext")] = .{
-        .llvm_name = "8msecext",
-        .description = "Enable support for ARMv8-M Security Extensions",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.a76)] = .{
-        .llvm_name = "a76",
-        .description = "Cortex-A76 ARM processors",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.aclass)] = .{
-        .llvm_name = "aclass",
-        .description = "Is application profile ('A' series)",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.acquire_release)] = .{
-        .llvm_name = "acquire-release",
-        .description = "Has v8 acquire/release (lda/ldaex  etc) instructions",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.aes)] = .{
-        .llvm_name = "aes",
-        .description = "Enable AES support",
-        .dependencies = featureSet(&[_]Feature{
-            .neon,
-        }),
-    };
-    result[@enumToInt(Feature.armv2)] = .{
-        .llvm_name = "armv2",
-        .description = "ARMv2 architecture",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.armv2a)] = .{
-        .llvm_name = "armv2a",
-        .description = "ARMv2a architecture",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.armv3)] = .{
-        .llvm_name = "armv3",
-        .description = "ARMv3 architecture",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.armv3m)] = .{
-        .llvm_name = "armv3m",
-        .description = "ARMv3m architecture",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.armv4)] = .{
-        .llvm_name = "armv4",
-        .description = "ARMv4 architecture",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.armv4t)] = .{
-        .llvm_name = "armv4t",
-        .description = "ARMv4t architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .v4t,
-        }),
-    };
-    result[@enumToInt(Feature.armv5t)] = .{
-        .llvm_name = "armv5t",
-        .description = "ARMv5t architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .v5t,
-        }),
-    };
-    result[@enumToInt(Feature.armv5te)] = .{
-        .llvm_name = "armv5te",
-        .description = "ARMv5te architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .v5te,
-        }),
-    };
-    result[@enumToInt(Feature.armv5tej)] = .{
-        .llvm_name = "armv5tej",
-        .description = "ARMv5tej architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .v5te,
-        }),
-    };
-    result[@enumToInt(Feature.armv6)] = .{
-        .llvm_name = "armv6",
-        .description = "ARMv6 architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .dsp,
-            .v6,
-        }),
-    };
-    result[@enumToInt(Feature.armv6_m)] = .{
-        .llvm_name = "armv6-m",
-        .description = "ARMv6m architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .db,
-            .mclass,
-            .noarm,
-            .strict_align,
-            .thumb_mode,
-            .v6m,
-        }),
-    };
-    result[@enumToInt(Feature.armv6j)] = .{
-        .llvm_name = "armv6j",
-        .description = "ARMv7a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .armv6,
-        }),
-    };
-    result[@enumToInt(Feature.armv6k)] = .{
-        .llvm_name = "armv6k",
-        .description = "ARMv6k architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .v6k,
-        }),
-    };
-    result[@enumToInt(Feature.armv6kz)] = .{
-        .llvm_name = "armv6kz",
-        .description = "ARMv6kz architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .trustzone,
-            .v6k,
-        }),
-    };
-    result[@enumToInt(Feature.armv6s_m)] = .{
-        .llvm_name = "armv6s-m",
-        .description = "ARMv6sm architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .db,
-            .mclass,
-            .noarm,
-            .strict_align,
-            .thumb_mode,
-            .v6m,
-        }),
-    };
-    result[@enumToInt(Feature.armv6t2)] = .{
-        .llvm_name = "armv6t2",
-        .description = "ARMv6t2 architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .dsp,
-            .v6t2,
-        }),
-    };
-    result[@enumToInt(Feature.armv7_a)] = .{
-        .llvm_name = "armv7-a",
-        .description = "ARMv7a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .db,
-            .dsp,
-            .neon,
-            .v7,
-        }),
-    };
-    result[@enumToInt(Feature.armv7_m)] = .{
-        .llvm_name = "armv7-m",
-        .description = "ARMv7m architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .db,
-            .hwdiv,
-            .mclass,
-            .noarm,
-            .thumb_mode,
-            .thumb2,
-            .v7,
-        }),
-    };
-    result[@enumToInt(Feature.armv7_r)] = .{
-        .llvm_name = "armv7-r",
-        .description = "ARMv7r architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .db,
-            .dsp,
-            .hwdiv,
-            .rclass,
-            .v7,
-        }),
-    };
-    result[@enumToInt(Feature.armv7e_m)] = .{
-        .llvm_name = "armv7e-m",
-        .description = "ARMv7em architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .db,
-            .dsp,
-            .hwdiv,
-            .mclass,
-            .noarm,
-            .thumb_mode,
-            .thumb2,
-            .v7,
-        }),
-    };
-    result[@enumToInt(Feature.armv7k)] = .{
-        .llvm_name = "armv7k",
-        .description = "ARMv7a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .armv7_a,
-        }),
-    };
-    result[@enumToInt(Feature.armv7s)] = .{
-        .llvm_name = "armv7s",
-        .description = "ARMv7a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .armv7_a,
-        }),
-    };
-    result[@enumToInt(Feature.armv7ve)] = .{
-        .llvm_name = "armv7ve",
-        .description = "ARMv7ve architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .db,
-            .dsp,
-            .mp,
-            .neon,
-            .trustzone,
-            .v7,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_a)] = .{
-        .llvm_name = "armv8-a",
-        .description = "ARMv8a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .crc,
-            .crypto,
-            .db,
-            .dsp,
-            .fp_armv8,
-            .mp,
-            .neon,
-            .trustzone,
-            .v8a,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_m_base)] = .{
-        .llvm_name = "armv8-m.base",
-        .description = "ARMv8mBaseline architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .@"8msecext",
-            .acquire_release,
-            .db,
-            .hwdiv,
-            .mclass,
-            .noarm,
-            .strict_align,
-            .thumb_mode,
-            .v7clrex,
-            .v8m,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_m_main)] = .{
-        .llvm_name = "armv8-m.main",
-        .description = "ARMv8mMainline architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .@"8msecext",
-            .acquire_release,
-            .db,
-            .hwdiv,
-            .mclass,
-            .noarm,
-            .thumb_mode,
-            .v8m_main,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_r)] = .{
-        .llvm_name = "armv8-r",
-        .description = "ARMv8r architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .crc,
-            .db,
-            .dfb,
-            .dsp,
-            .fp_armv8,
-            .mp,
-            .neon,
-            .rclass,
-            .v8a,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_1_a)] = .{
-        .llvm_name = "armv8.1-a",
-        .description = "ARMv81a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .crc,
-            .crypto,
-            .db,
-            .dsp,
-            .fp_armv8,
-            .mp,
-            .neon,
-            .trustzone,
-            .v8_1a,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_1_m_main)] = .{
-        .llvm_name = "armv8.1-m.main",
-        .description = "ARMv81mMainline architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .@"8msecext",
-            .acquire_release,
-            .db,
-            .hwdiv,
-            .lob,
-            .mclass,
-            .noarm,
-            .ras,
-            .thumb_mode,
-            .v8_1m_main,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_2_a)] = .{
-        .llvm_name = "armv8.2-a",
-        .description = "ARMv82a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .crc,
-            .crypto,
-            .db,
-            .dsp,
-            .fp_armv8,
-            .mp,
-            .neon,
-            .ras,
-            .trustzone,
-            .v8_2a,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_3_a)] = .{
-        .llvm_name = "armv8.3-a",
-        .description = "ARMv83a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .crc,
-            .crypto,
-            .db,
-            .dsp,
-            .fp_armv8,
-            .mp,
-            .neon,
-            .ras,
-            .trustzone,
-            .v8_3a,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.armv8_4_a)] = .{
-        .llvm_name = "armv8.4-a",
-        .description = "ARMv84a architecture",
-        .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .crc,
-            .crypto,
-            .db,
-            .dotprod,
-            .dsp,
-            .fp_armv8,
-            .mp,
-            .neon,
-            .ras,
-            .trustzone,
-            .v8_4a,
-            .virtualization,
-        }),
+    result[@enumToInt(Feature.@"8msecext")] = .{
+        .llvm_name = "8msecext",
+        .description = "Enable support for ARMv8-M Security Extensions",
+        .dependencies = featureSet(&[_]Feature{}),
     };
-    result[@enumToInt(Feature.armv8_5_a)] = .{
-        .llvm_name = "armv8.5-a",
-        .description = "ARMv85a architecture",
+    result[@enumToInt(Feature.a76)] = .{
+        .llvm_name = "a76",
+        .description = "Cortex-A76 ARM processors",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.aclass)] = .{
+        .llvm_name = "aclass",
+        .description = "Is application profile ('A' series)",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.acquire_release)] = .{
+        .llvm_name = "acquire-release",
+        .description = "Has v8 acquire/release (lda/ldaex  etc) instructions",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.aes)] = .{
+        .llvm_name = "aes",
+        .description = "Enable AES support",
         .dependencies = featureSet(&[_]Feature{
-            .aclass,
-            .crc,
-            .crypto,
-            .db,
-            .dotprod,
-            .dsp,
-            .fp_armv8,
-            .mp,
             .neon,
-            .ras,
-            .trustzone,
-            .v8_5a,
-            .virtualization,
         }),
     };
     result[@enumToInt(Feature.avoid_movs_shop)] = .{
@@ -659,6 +297,25 @@ pub const all_features = blk: {
             .zcz,
         }),
     };
+    result[@enumToInt(Feature.fp16)] = .{
+        .llvm_name = "fp16",
+        .description = "Enable half-precision floating point",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.fp16fml)] = .{
+        .llvm_name = "fp16fml",
+        .description = "Enable full half-precision floating point fml instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .fullfp16,
+        }),
+    };
+    result[@enumToInt(Feature.fp64)] = .{
+        .llvm_name = "fp64",
+        .description = "Floating point unit supports double precision",
+        .dependencies = featureSet(&[_]Feature{
+            .fpregs64,
+        }),
+    };
     result[@enumToInt(Feature.fp_armv8)] = .{
         .llvm_name = "fp-armv8",
         .description = "Enable ARMv8 FP",
@@ -693,25 +350,6 @@ pub const all_features = blk: {
             .vfp4sp,
         }),
     };
-    result[@enumToInt(Feature.fp16)] = .{
-        .llvm_name = "fp16",
-        .description = "Enable half-precision floating point",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@enumToInt(Feature.fp16fml)] = .{
-        .llvm_name = "fp16fml",
-        .description = "Enable full half-precision floating point fml instructions",
-        .dependencies = featureSet(&[_]Feature{
-            .fullfp16,
-        }),
-    };
-    result[@enumToInt(Feature.fp64)] = .{
-        .llvm_name = "fp64",
-        .description = "Floating point unit supports double precision",
-        .dependencies = featureSet(&[_]Feature{
-            .fpregs64,
-        }),
-    };
     result[@enumToInt(Feature.fpao)] = .{
         .llvm_name = "fpao",
         .description = "Enable fast computation of positive address offsets",
@@ -754,6 +392,135 @@ pub const all_features = blk: {
         .description = "CPU fuses literal generation operations",
         .dependencies = featureSet(&[_]Feature{}),
     };
+    result[@enumToInt(Feature.has_v4t)] = .{
+        .llvm_name = "v4t",
+        .description = "Support ARM v4T instructions",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.has_v5t)] = .{
+        .llvm_name = "v5t",
+        .description = "Support ARM v5T instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v4t,
+        }),
+    };
+    result[@enumToInt(Feature.has_v5te)] = .{
+        .llvm_name = "v5te",
+        .description = "Support ARM v5TE, v5TEj, and v5TExp instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v5t,
+        }),
+    };
+    result[@enumToInt(Feature.has_v6)] = .{
+        .llvm_name = "v6",
+        .description = "Support ARM v6 instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v5te,
+        }),
+    };
+    result[@enumToInt(Feature.has_v6k)] = .{
+        .llvm_name = "v6k",
+        .description = "Support ARM v6k instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v6,
+        }),
+    };
+    result[@enumToInt(Feature.has_v6m)] = .{
+        .llvm_name = "v6m",
+        .description = "Support ARM v6M instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v6,
+        }),
+    };
+    result[@enumToInt(Feature.has_v6t2)] = .{
+        .llvm_name = "v6t2",
+        .description = "Support ARM v6t2 instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .thumb2,
+            .has_v6k,
+            .has_v8m,
+        }),
+    };
+    result[@enumToInt(Feature.has_v7)] = .{
+        .llvm_name = "v7",
+        .description = "Support ARM v7 instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .perfmon,
+            .has_v6t2,
+            .has_v7clrex,
+        }),
+    };
+    result[@enumToInt(Feature.has_v7clrex)] = .{
+        .llvm_name = "v7clrex",
+        .description = "Has v7 clrex instruction",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.has_v8)] = .{
+        .llvm_name = "v8",
+        .description = "Support ARM v8 instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .acquire_release,
+            .has_v7,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_1a)] = .{
+        .llvm_name = "v8.1a",
+        .description = "Support ARM v8.1a instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v8,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_1m_main)] = .{
+        .llvm_name = "v8.1m.main",
+        .description = "Support ARM v8-1M Mainline instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v8m_main,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_2a)] = .{
+        .llvm_name = "v8.2a",
+        .description = "Support ARM v8.2a instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v8_1a,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_3a)] = .{
+        .llvm_name = "v8.3a",
+        .description = "Support ARM v8.3a instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v8_2a,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_4a)] = .{
+        .llvm_name = "v8.4a",
+        .description = "Support ARM v8.4a instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .dotprod,
+            .has_v8_3a,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_5a)] = .{
+        .llvm_name = "v8.5a",
+        .description = "Support ARM v8.5a instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .sb,
+            .has_v8_4a,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8m)] = .{
+        .llvm_name = "v8m",
+        .description = "Support ARM v8M Baseline instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v6m,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8m_main)] = .{
+        .llvm_name = "v8m.main",
+        .description = "Support ARM v8M Mainline instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v7,
+        }),
+    };
     result[@enumToInt(Feature.hwdiv)] = .{
         .llvm_name = "hwdiv",
         .description = "Enable divide instructions in Thumb",
@@ -768,14 +535,14 @@ pub const all_features = blk: {
         .llvm_name = "iwmmxt",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     result[@enumToInt(Feature.iwmmxt2)] = .{
         .llvm_name = "iwmmxt2",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     result[@enumToInt(Feature.lob)] = .{
@@ -820,7 +587,7 @@ pub const all_features = blk: {
             .dsp,
             .fpregs16,
             .fpregs64,
-            .v8_1m_main,
+            .has_v8_1m_main,
         }),
     };
     result[@enumToInt(Feature.mve_fp)] = .{
@@ -993,16 +760,16 @@ pub const all_features = blk: {
         .description = "Swift ARM processors",
         .dependencies = featureSet(&[_]Feature{}),
     };
-    result[@enumToInt(Feature.thumb_mode)] = .{
-        .llvm_name = "thumb-mode",
-        .description = "Thumb mode",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
     result[@enumToInt(Feature.thumb2)] = .{
         .llvm_name = "thumb2",
         .description = "Enable Thumb2 instructions",
         .dependencies = featureSet(&[_]Feature{}),
     };
+    result[@enumToInt(Feature.thumb_mode)] = .{
+        .llvm_name = "thumb-mode",
+        .description = "Thumb mode",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
     result[@enumToInt(Feature.trustzone)] = .{
         .llvm_name = "trustzone",
         .description = "Enable support for TrustZone security extensions",
@@ -1018,133 +785,366 @@ pub const all_features = blk: {
         .description = "Use the MachineScheduler",
         .dependencies = featureSet(&[_]Feature{}),
     };
-    result[@enumToInt(Feature.v4t)] = .{
-        .llvm_name = "v4t",
-        .description = "Support ARM v4T instructions",
-        .dependencies = featureSet(&[_]Feature{}),
+    result[@enumToInt(Feature.v2)] = .{
+        .llvm_name = "armv2",
+        .description = "ARMv2 architecture",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.v2a)] = .{
+        .llvm_name = "armv2a",
+        .description = "ARMv2a architecture",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.v3)] = .{
+        .llvm_name = "armv3",
+        .description = "ARMv3 architecture",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.v3m)] = .{
+        .llvm_name = "armv3m",
+        .description = "ARMv3m architecture",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.v4)] = .{
+        .llvm_name = "armv4",
+        .description = "ARMv4 architecture",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.v4t)] = .{
+        .llvm_name = "armv4t",
+        .description = "ARMv4t architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v4t,
+        }),
+    };
+    result[@enumToInt(Feature.v5t)] = .{
+        .llvm_name = "armv5t",
+        .description = "ARMv5t architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v5t,
+        }),
+    };
+    result[@enumToInt(Feature.v5te)] = .{
+        .llvm_name = "armv5te",
+        .description = "ARMv5te architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v5te,
+        }),
+    };
+    result[@enumToInt(Feature.v5tej)] = .{
+        .llvm_name = "armv5tej",
+        .description = "ARMv5tej architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v5te,
+        }),
+    };
+    result[@enumToInt(Feature.v6)] = .{
+        .llvm_name = "armv6",
+        .description = "ARMv6 architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .dsp,
+            .has_v6,
+        }),
+    };
+    result[@enumToInt(Feature.v6m)] = .{
+        .llvm_name = "armv6-m",
+        .description = "ARMv6m architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .db,
+            .mclass,
+            .noarm,
+            .strict_align,
+            .thumb_mode,
+            .has_v6m,
+        }),
+    };
+    result[@enumToInt(Feature.v6j)] = .{
+        .llvm_name = "armv6j",
+        .description = "ARMv7a architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .v6,
+        }),
+    };
+    result[@enumToInt(Feature.v6k)] = .{
+        .llvm_name = "armv6k",
+        .description = "ARMv6k architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v6k,
+        }),
     };
-    result[@enumToInt(Feature.v5t)] = .{
-        .llvm_name = "v5t",
-        .description = "Support ARM v5T instructions",
+    result[@enumToInt(Feature.v6kz)] = .{
+        .llvm_name = "armv6kz",
+        .description = "ARMv6kz architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v4t,
+            .trustzone,
+            .has_v6k,
         }),
     };
-    result[@enumToInt(Feature.v5te)] = .{
-        .llvm_name = "v5te",
-        .description = "Support ARM v5TE, v5TEj, and v5TExp instructions",
+    result[@enumToInt(Feature.v6sm)] = .{
+        .llvm_name = "armv6s-m",
+        .description = "ARMv6sm architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v5t,
+            .db,
+            .mclass,
+            .noarm,
+            .strict_align,
+            .thumb_mode,
+            .has_v6m,
         }),
     };
-    result[@enumToInt(Feature.v6)] = .{
-        .llvm_name = "v6",
-        .description = "Support ARM v6 instructions",
+    result[@enumToInt(Feature.v6t2)] = .{
+        .llvm_name = "armv6t2",
+        .description = "ARMv6t2 architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v5te,
+            .dsp,
+            .has_v6t2,
         }),
     };
-    result[@enumToInt(Feature.v6k)] = .{
-        .llvm_name = "v6k",
-        .description = "Support ARM v6k instructions",
+    result[@enumToInt(Feature.v7a)] = .{
+        .llvm_name = "armv7-a",
+        .description = "ARMv7a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v6,
+            .aclass,
+            .db,
+            .dsp,
+            .neon,
+            .has_v7,
         }),
     };
-    result[@enumToInt(Feature.v6m)] = .{
-        .llvm_name = "v6m",
-        .description = "Support ARM v6M instructions",
+    result[@enumToInt(Feature.v7m)] = .{
+        .llvm_name = "armv7-m",
+        .description = "ARMv7m architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v6,
+            .db,
+            .hwdiv,
+            .mclass,
+            .noarm,
+            .thumb_mode,
+            .thumb2,
+            .has_v7,
         }),
     };
-    result[@enumToInt(Feature.v6t2)] = .{
-        .llvm_name = "v6t2",
-        .description = "Support ARM v6t2 instructions",
+    result[@enumToInt(Feature.v7r)] = .{
+        .llvm_name = "armv7-r",
+        .description = "ARMv7r architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .db,
+            .dsp,
+            .hwdiv,
+            .rclass,
+            .has_v7,
+        }),
+    };
+    result[@enumToInt(Feature.v7em)] = .{
+        .llvm_name = "armv7e-m",
+        .description = "ARMv7em architecture",
         .dependencies = featureSet(&[_]Feature{
+            .db,
+            .dsp,
+            .hwdiv,
+            .mclass,
+            .noarm,
+            .thumb_mode,
             .thumb2,
-            .v6k,
-            .v8m,
+            .has_v7,
         }),
     };
-    result[@enumToInt(Feature.v7)] = .{
-        .llvm_name = "v7",
-        .description = "Support ARM v7 instructions",
+    result[@enumToInt(Feature.v7k)] = .{
+        .llvm_name = "armv7k",
+        .description = "ARMv7a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .perfmon,
-            .v6t2,
-            .v7clrex,
+            .v7a,
         }),
     };
-    result[@enumToInt(Feature.v7clrex)] = .{
-        .llvm_name = "v7clrex",
-        .description = "Has v7 clrex instruction",
-        .dependencies = featureSet(&[_]Feature{}),
+    result[@enumToInt(Feature.v7s)] = .{
+        .llvm_name = "armv7s",
+        .description = "ARMv7a architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .v7a,
+        }),
+    };
+    result[@enumToInt(Feature.v7ve)] = .{
+        .llvm_name = "armv7ve",
+        .description = "ARMv7ve architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .aclass,
+            .db,
+            .dsp,
+            .mp,
+            .neon,
+            .trustzone,
+            .has_v7,
+            .virtualization,
+        }),
     };
     result[@enumToInt(Feature.v8a)] = .{
-        .llvm_name = "v8a",
-        .description = "Support ARM v8a instructions",
+        .llvm_name = "armv8-a",
+        .description = "ARMv8a architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .trustzone,
+            .has_v8,
+            .virtualization,
+        }),
+    };
+    result[@enumToInt(Feature.v8m)] = .{
+        .llvm_name = "armv8-m.base",
+        .description = "ARMv8mBaseline architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .@"8msecext",
+            .acquire_release,
+            .db,
+            .hwdiv,
+            .mclass,
+            .noarm,
+            .strict_align,
+            .thumb_mode,
+            .has_v7clrex,
+            .has_v8m,
+        }),
+    };
+    result[@enumToInt(Feature.v8m_main)] = .{
+        .llvm_name = "armv8-m.main",
+        .description = "ARMv8mMainline architecture",
         .dependencies = featureSet(&[_]Feature{
+            .@"8msecext",
             .acquire_release,
-            .v7,
+            .db,
+            .hwdiv,
+            .mclass,
+            .noarm,
+            .thumb_mode,
+            .has_v8m_main,
+        }),
+    };
+    result[@enumToInt(Feature.v8r)] = .{
+        .llvm_name = "armv8-r",
+        .description = "ARMv8r architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .crc,
+            .db,
+            .dfb,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .rclass,
+            .has_v8,
+            .virtualization,
         }),
     };
     result[@enumToInt(Feature.v8_1a)] = .{
-        .llvm_name = "v8.1a",
-        .description = "Support ARM v8.1a instructions",
+        .llvm_name = "armv8.1-a",
+        .description = "ARMv81a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v8a,
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .trustzone,
+            .has_v8_1a,
+            .virtualization,
         }),
     };
     result[@enumToInt(Feature.v8_1m_main)] = .{
-        .llvm_name = "v8.1m.main",
-        .description = "Support ARM v8-1M Mainline instructions",
+        .llvm_name = "armv8.1-m.main",
+        .description = "ARMv81mMainline architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v8m_main,
+            .@"8msecext",
+            .acquire_release,
+            .db,
+            .hwdiv,
+            .lob,
+            .mclass,
+            .noarm,
+            .ras,
+            .thumb_mode,
+            .has_v8_1m_main,
         }),
     };
     result[@enumToInt(Feature.v8_2a)] = .{
-        .llvm_name = "v8.2a",
-        .description = "Support ARM v8.2a instructions",
+        .llvm_name = "armv8.2-a",
+        .description = "ARMv82a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v8_1a,
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .ras,
+            .trustzone,
+            .has_v8_2a,
+            .virtualization,
         }),
     };
     result[@enumToInt(Feature.v8_3a)] = .{
-        .llvm_name = "v8.3a",
-        .description = "Support ARM v8.3a instructions",
+        .llvm_name = "armv8.3-a",
+        .description = "ARMv83a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v8_2a,
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .ras,
+            .trustzone,
+            .has_v8_3a,
+            .virtualization,
         }),
     };
     result[@enumToInt(Feature.v8_4a)] = .{
-        .llvm_name = "v8.4a",
-        .description = "Support ARM v8.4a instructions",
+        .llvm_name = "armv8.4-a",
+        .description = "ARMv84a architecture",
         .dependencies = featureSet(&[_]Feature{
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
             .dotprod,
-            .v8_3a,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .ras,
+            .trustzone,
+            .has_v8_4a,
+            .virtualization,
         }),
     };
     result[@enumToInt(Feature.v8_5a)] = .{
-        .llvm_name = "v8.5a",
-        .description = "Support ARM v8.5a instructions",
-        .dependencies = featureSet(&[_]Feature{
-            .sb,
-            .v8_4a,
-        }),
-    };
-    result[@enumToInt(Feature.v8m)] = .{
-        .llvm_name = "v8m",
-        .description = "Support ARM v8M Baseline instructions",
-        .dependencies = featureSet(&[_]Feature{
-            .v6m,
-        }),
-    };
-    result[@enumToInt(Feature.v8m_main)] = .{
-        .llvm_name = "v8m.main",
-        .description = "Support ARM v8M Mainline instructions",
+        .llvm_name = "armv8.5-a",
+        .description = "ARMv85a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v7,
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dotprod,
+            .dsp,
+            .fp_armv8,
+            .mp,
+            .neon,
+            .ras,
+            .trustzone,
+            .has_v8_5a,
+            .virtualization,
         }),
     };
     result[@enumToInt(Feature.vfp2)] = .{
@@ -1279,7 +1279,7 @@ pub const all_features = blk: {
         .llvm_name = "xscale",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     result[@enumToInt(Feature.zcz)] = .{
@@ -1300,49 +1300,49 @@ pub const cpu = struct {
         .name = "arm1020e",
         .llvm_name = "arm1020e",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm1020t = CpuModel{
         .name = "arm1020t",
         .llvm_name = "arm1020t",
         .features = featureSet(&[_]Feature{
-            .v5t,
+            .has_v5t,
         }),
     };
     pub const arm1022e = CpuModel{
         .name = "arm1022e",
         .llvm_name = "arm1022e",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm10e = CpuModel{
         .name = "arm10e",
         .llvm_name = "arm10e",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm10tdmi = CpuModel{
         .name = "arm10tdmi",
         .llvm_name = "arm10tdmi",
         .features = featureSet(&[_]Feature{
-            .v5t,
+            .has_v5t,
         }),
     };
     pub const arm1136j_s = CpuModel{
         .name = "arm1136j_s",
         .llvm_name = "arm1136j-s",
         .features = featureSet(&[_]Feature{
-            .v6,
+            .has_v6,
         }),
     };
     pub const arm1136jf_s = CpuModel{
         .name = "arm1136jf_s",
         .llvm_name = "arm1136jf-s",
         .features = featureSet(&[_]Feature{
-            .v6,
+            .has_v6,
             .slowfpvmlx,
             .vfp2,
         }),
@@ -1351,14 +1351,14 @@ pub const cpu = struct {
         .name = "arm1156t2_s",
         .llvm_name = "arm1156t2-s",
         .features = featureSet(&[_]Feature{
-            .v6t2,
+            .has_v6t2,
         }),
     };
     pub const arm1156t2f_s = CpuModel{
         .name = "arm1156t2f_s",
         .llvm_name = "arm1156t2f-s",
         .features = featureSet(&[_]Feature{
-            .v6t2,
+            .has_v6t2,
             .slowfpvmlx,
             .vfp2,
         }),
@@ -1390,28 +1390,28 @@ pub const cpu = struct {
         .name = "arm710t",
         .llvm_name = "arm710t",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm720t = CpuModel{
         .name = "arm720t",
         .llvm_name = "arm720t",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm7tdmi = CpuModel{
         .name = "arm7tdmi",
         .llvm_name = "arm7tdmi",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm7tdmi_s = CpuModel{
         .name = "arm7tdmi_s",
         .llvm_name = "arm7tdmi-s",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm8 = CpuModel{
@@ -1432,84 +1432,84 @@ pub const cpu = struct {
         .name = "arm9",
         .llvm_name = "arm9",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm920 = CpuModel{
         .name = "arm920",
         .llvm_name = "arm920",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm920t = CpuModel{
         .name = "arm920t",
         .llvm_name = "arm920t",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm922t = CpuModel{
         .name = "arm922t",
         .llvm_name = "arm922t",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm926ej_s = CpuModel{
         .name = "arm926ej_s",
         .llvm_name = "arm926ej-s",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm940t = CpuModel{
         .name = "arm940t",
         .llvm_name = "arm940t",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const arm946e_s = CpuModel{
         .name = "arm946e_s",
         .llvm_name = "arm946e-s",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm966e_s = CpuModel{
         .name = "arm966e_s",
         .llvm_name = "arm966e-s",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm968e_s = CpuModel{
         .name = "arm968e_s",
         .llvm_name = "arm968e-s",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm9e = CpuModel{
         .name = "arm9e",
         .llvm_name = "arm9e",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const arm9tdmi = CpuModel{
         .name = "arm9tdmi",
         .llvm_name = "arm9tdmi",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const baseline = CpuModel{
         .name = "baseline",
         .llvm_name = "generic",
         .features = featureSet(&[_]Feature{
-            .v6m,
+            .has_v6m,
         }),
     };
     pub const cortex_a12 = CpuModel{
@@ -1561,7 +1561,7 @@ pub const cpu = struct {
         .name = "cortex_a32",
         .llvm_name = "cortex-a32",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .crc,
             .crypto,
             .hwdiv,
@@ -1572,7 +1572,7 @@ pub const cpu = struct {
         .name = "cortex_a35",
         .llvm_name = "cortex-a35",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .crc,
             .crypto,
             .hwdiv,
@@ -1597,7 +1597,7 @@ pub const cpu = struct {
         .name = "cortex_a53",
         .llvm_name = "cortex-a53",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .crc,
             .crypto,
             .fpao,
@@ -1609,7 +1609,7 @@ pub const cpu = struct {
         .name = "cortex_a55",
         .llvm_name = "cortex-a55",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
+            .has_v8_2a,
             .dotprod,
             .hwdiv,
             .hwdiv_arm,
@@ -1619,7 +1619,7 @@ pub const cpu = struct {
         .name = "cortex_a57",
         .llvm_name = "cortex-a57",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .avoid_partial_cpsr,
             .cheap_predicable_cpsr,
             .crc,
@@ -1649,7 +1649,7 @@ pub const cpu = struct {
         .name = "cortex_a72",
         .llvm_name = "cortex-a72",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .crc,
             .crypto,
             .hwdiv,
@@ -1660,7 +1660,7 @@ pub const cpu = struct {
         .name = "cortex_a73",
         .llvm_name = "cortex-a73",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .crc,
             .crypto,
             .hwdiv,
@@ -1671,7 +1671,7 @@ pub const cpu = struct {
         .name = "cortex_a75",
         .llvm_name = "cortex-a75",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
+            .has_v8_2a,
             .dotprod,
             .hwdiv,
             .hwdiv_arm,
@@ -1682,7 +1682,7 @@ pub const cpu = struct {
         .llvm_name = "cortex-a76",
         .features = featureSet(&[_]Feature{
             .a76,
-            .v8_2a,
+            .has_v8_2a,
             .crc,
             .crypto,
             .dotprod,
@@ -1696,7 +1696,7 @@ pub const cpu = struct {
         .llvm_name = "cortex-a76ae",
         .features = featureSet(&[_]Feature{
             .a76,
-            .v8_2a,
+            .has_v8_2a,
             .crc,
             .crypto,
             .dotprod,
@@ -1742,28 +1742,28 @@ pub const cpu = struct {
         .name = "cortex_m0",
         .llvm_name = "cortex-m0",
         .features = featureSet(&[_]Feature{
-            .v6m,
+            .has_v6m,
         }),
     };
     pub const cortex_m0plus = CpuModel{
         .name = "cortex_m0plus",
         .llvm_name = "cortex-m0plus",
         .features = featureSet(&[_]Feature{
-            .v6m,
+            .has_v6m,
         }),
     };
     pub const cortex_m1 = CpuModel{
         .name = "cortex_m1",
         .llvm_name = "cortex-m1",
         .features = featureSet(&[_]Feature{
-            .v6m,
+            .has_v6m,
         }),
     };
     pub const cortex_m23 = CpuModel{
         .name = "cortex_m23",
         .llvm_name = "cortex-m23",
         .features = featureSet(&[_]Feature{
-            .v8m,
+            .has_v8m,
             .no_movt,
         }),
     };
@@ -1783,7 +1783,7 @@ pub const cpu = struct {
         .name = "cortex_m33",
         .llvm_name = "cortex-m33",
         .features = featureSet(&[_]Feature{
-            .v8m_main,
+            .has_v8m_main,
             .dsp,
             .fp_armv8d16sp,
             .loop_align,
@@ -1797,7 +1797,7 @@ pub const cpu = struct {
         .name = "cortex_m35p",
         .llvm_name = "cortex-m35p",
         .features = featureSet(&[_]Feature{
-            .v8m_main,
+            .has_v8m_main,
             .dsp,
             .fp_armv8d16sp,
             .loop_align,
@@ -1908,7 +1908,7 @@ pub const cpu = struct {
         .name = "cyclone",
         .llvm_name = "cyclone",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .avoid_movs_shop,
             .avoid_partial_cpsr,
             .crypto,
@@ -1929,14 +1929,14 @@ pub const cpu = struct {
         .name = "ep9312",
         .llvm_name = "ep9312",
         .features = featureSet(&[_]Feature{
-            .v4t,
+            .has_v4t,
         }),
     };
     pub const exynos_m1 = CpuModel{
         .name = "exynos_m1",
         .llvm_name = "exynos-m1",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .exynos,
         }),
     };
@@ -1944,7 +1944,7 @@ pub const cpu = struct {
         .name = "exynos_m2",
         .llvm_name = "exynos-m2",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .exynos,
         }),
     };
@@ -1952,7 +1952,7 @@ pub const cpu = struct {
         .name = "exynos_m3",
         .llvm_name = "exynos-m3",
         .features = featureSet(&[_]Feature{
-            .v8a,
+            .has_v8,
             .exynos,
         }),
     };
@@ -1960,7 +1960,7 @@ pub const cpu = struct {
         .name = "exynos_m4",
         .llvm_name = "exynos-m4",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
+            .has_v8_2a,
             .dotprod,
             .exynos,
             .fullfp16,
@@ -1973,7 +1973,7 @@ pub const cpu = struct {
             .dotprod,
             .exynos,
             .fullfp16,
-            .v8_2a,
+            .has_v8_2a,
         }),
     };
     pub const generic = CpuModel{
@@ -1985,7 +1985,7 @@ pub const cpu = struct {
         .name = "iwmmxt",
         .llvm_name = "iwmmxt",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
     pub const krait = CpuModel{
@@ -2012,14 +2012,14 @@ pub const cpu = struct {
             .crypto,
             .hwdiv,
             .hwdiv_arm,
-            .v8a,
+            .has_v8,
         }),
     };
     pub const mpcore = CpuModel{
         .name = "mpcore",
         .llvm_name = "mpcore",
         .features = featureSet(&[_]Feature{
-            .v6k,
+            .has_v6k,
             .slowfpvmlx,
             .vfp2,
         }),
@@ -2028,14 +2028,14 @@ pub const cpu = struct {
         .name = "mpcorenovfp",
         .llvm_name = "mpcorenovfp",
         .features = featureSet(&[_]Feature{
-            .v6k,
+            .has_v6k,
         }),
     };
     pub const sc000 = CpuModel{
         .name = "sc000",
         .llvm_name = "sc000",
         .features = featureSet(&[_]Feature{
-            .v6m,
+            .has_v6m,
         }),
     };
     pub const sc300 = CpuModel{
@@ -2108,7 +2108,7 @@ pub const cpu = struct {
         .name = "xscale",
         .llvm_name = "xscale",
         .features = featureSet(&[_]Feature{
-            .v5te,
+            .has_v5te,
         }),
     };
 };
lib/std/target.zig
@@ -219,7 +219,7 @@ pub const Target = union(enum) {
             pub const Set = struct {
                 ints: [usize_count]usize,
 
-                pub const needed_bit_count = 138;
+                pub const needed_bit_count = 154;
                 pub const byte_count = (needed_bit_count + 7) / 8;
                 pub const usize_count = (byte_count + (@sizeOf(usize) - 1)) / @sizeOf(usize);
                 pub const Index = std.math.Log2Int(@IntType(false, usize_count * @bitSizeOf(usize)));