Commit ab36a162d0

Andrew Kelley <andrew@ziglang.org>
2021-02-28 05:10:00
update ARM target CPU features
This completes the process. All target CPU features are now auto-generated by the tools/update_cpu_features.zig script, which contains all the overrides. Invoking this tool against LLVM 12rc2 now produces an empty git diff.
1 parent 85ab1b0
Changed files (2)
lib
std
target
tools
lib/std/target/arm.zig
@@ -1,8 +1,5 @@
-// SPDX-License-Identifier: MIT
-// Copyright (c) 2015-2021 Zig Contributors
-// This file is part of [zig](https://ziglang.org/), which is MIT licensed.
-// The MIT license requires this copyright notice to be included in all copies
-// and substantial portions of the software.
+//! This file is auto-generated by tools/update_cpu_features.zig.
+
 const std = @import("../std.zig");
 const CpuFeature = std.Target.Cpu.Feature;
 const CpuModel = std.Target.Cpu.Model;
@@ -53,6 +50,8 @@ pub const Feature = enum {
     fullfp16,
     fuse_aes,
     fuse_literals,
+    harden_sls_blr,
+    harden_sls_retbr,
     has_v4t,
     has_v5t,
     has_v5te,
@@ -62,6 +61,7 @@ pub const Feature = enum {
     has_v6t2,
     has_v7,
     has_v7clrex,
+    has_v8,
     has_v8_1a,
     has_v8_1m_main,
     has_v8_2a,
@@ -69,7 +69,7 @@ pub const Feature = enum {
     has_v8_4a,
     has_v8_5a,
     has_v8_6a,
-    has_v8,
+    has_v8_7a,
     has_v8m,
     has_v8m_main,
     hwdiv,
@@ -85,10 +85,10 @@ pub const Feature = enum {
     mp,
     muxed_units,
     mve,
-    mve_fp,
     mve1beat,
     mve2beat,
     mve4beat,
+    mve_fp,
     nacl_trap,
     neon,
     neon_fpmovs,
@@ -148,10 +148,6 @@ pub const Feature = enum {
     v7r,
     v7s,
     v7ve,
-    v8a,
-    v8m,
-    v8m_main,
-    v8r,
     v8_1a,
     v8_1m_main,
     v8_2a,
@@ -159,6 +155,11 @@ pub const Feature = enum {
     v8_4a,
     v8_5a,
     v8_6a,
+    v8_7a,
+    v8a,
+    v8m,
+    v8m_main,
+    v8r,
     vfp2,
     vfp2sp,
     vfp3,
@@ -238,7 +239,7 @@ pub const all_features = blk: {
         .llvm_name = "cde",
         .description = "Support CDE instructions",
         .dependencies = featureSet(&[_]Feature{
-            .v8m_main,
+            .has_v8m_main,
         }),
     };
     result[@enumToInt(Feature.cdecp0)] = .{
@@ -312,7 +313,6 @@ pub const all_features = blk: {
         .description = "Enable support for Cryptography extensions",
         .dependencies = featureSet(&[_]Feature{
             .aes,
-            .neon,
             .sha2,
         }),
     };
@@ -419,7 +419,6 @@ pub const all_features = blk: {
         .description = "Enable ARMv8 FP with only 16 d-registers",
         .dependencies = featureSet(&[_]Feature{
             .fp_armv8d16sp,
-            .fp64,
             .vfp4d16,
         }),
     };
@@ -434,7 +433,6 @@ pub const all_features = blk: {
         .llvm_name = "fp-armv8sp",
         .description = "Enable ARMv8 FP with no double precision",
         .dependencies = featureSet(&[_]Feature{
-            .d32,
             .fp_armv8d16sp,
             .vfp4sp,
         }),
@@ -481,6 +479,16 @@ pub const all_features = blk: {
         .description = "CPU fuses literal generation operations",
         .dependencies = featureSet(&[_]Feature{}),
     };
+    result[@enumToInt(Feature.harden_sls_blr)] = .{
+        .llvm_name = "harden-sls-blr",
+        .description = "Harden against straight line speculation across indirect calls",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
+    result[@enumToInt(Feature.harden_sls_retbr)] = .{
+        .llvm_name = "harden-sls-retbr",
+        .description = "Harden against straight line speculation across RETurn and BranchRegister instructions",
+        .dependencies = featureSet(&[_]Feature{}),
+    };
     result[@enumToInt(Feature.has_v4t)] = .{
         .llvm_name = "v4t",
         .description = "Support ARM v4T instructions",
@@ -525,18 +533,18 @@ pub const all_features = blk: {
         .llvm_name = "v6t2",
         .description = "Support ARM v6t2 instructions",
         .dependencies = featureSet(&[_]Feature{
-            .thumb2,
             .has_v6k,
             .has_v8m,
+            .thumb2,
         }),
     };
     result[@enumToInt(Feature.has_v7)] = .{
         .llvm_name = "v7",
         .description = "Support ARM v7 instructions",
         .dependencies = featureSet(&[_]Feature{
-            .perfmon,
             .has_v6t2,
             .has_v7clrex,
+            .perfmon,
         }),
     };
     result[@enumToInt(Feature.has_v7clrex)] = .{
@@ -592,8 +600,8 @@ pub const all_features = blk: {
         .llvm_name = "v8.5a",
         .description = "Support ARM v8.5a instructions",
         .dependencies = featureSet(&[_]Feature{
-            .sb,
             .has_v8_4a,
+            .sb,
         }),
     };
     result[@enumToInt(Feature.has_v8_6a)] = .{
@@ -601,8 +609,15 @@ pub const all_features = blk: {
         .description = "Support ARM v8.6a instructions",
         .dependencies = featureSet(&[_]Feature{
             .bf16,
-            .i8mm,
             .has_v8_5a,
+            .i8mm,
+        }),
+    };
+    result[@enumToInt(Feature.has_v8_7a)] = .{
+        .llvm_name = "v8.7a",
+        .description = "Support ARM v8.7a instructions",
+        .dependencies = featureSet(&[_]Feature{
+            .has_v8_6a,
         }),
     };
     result[@enumToInt(Feature.has_v8m)] = .{
@@ -640,14 +655,14 @@ pub const all_features = blk: {
         .llvm_name = "iwmmxt",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .has_v5te,
+            .v5te,
         }),
     };
     result[@enumToInt(Feature.iwmmxt2)] = .{
         .llvm_name = "iwmmxt2",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .has_v5te,
+            .v5te,
         }),
     };
     result[@enumToInt(Feature.lob)] = .{
@@ -695,15 +710,6 @@ pub const all_features = blk: {
             .has_v8_1m_main,
         }),
     };
-    result[@enumToInt(Feature.mve_fp)] = .{
-        .llvm_name = "mve.fp",
-        .description = "Support M-Class Vector Extension with integer and floating ops",
-        .dependencies = featureSet(&[_]Feature{
-            .fp_armv8d16sp,
-            .fullfp16,
-            .mve,
-        }),
-    };
     result[@enumToInt(Feature.mve1beat)] = .{
         .llvm_name = "mve1beat",
         .description = "Model MVE instructions as a 1 beat per tick architecture",
@@ -719,6 +725,14 @@ pub const all_features = blk: {
         .description = "Model MVE instructions as a 4 beats per tick architecture",
         .dependencies = featureSet(&[_]Feature{}),
     };
+    result[@enumToInt(Feature.mve_fp)] = .{
+        .llvm_name = "mve.fp",
+        .description = "Support M-Class Vector Extension with integer and floating ops",
+        .dependencies = featureSet(&[_]Feature{
+            .fullfp16,
+            .mve,
+        }),
+    };
     result[@enumToInt(Feature.nacl_trap)] = .{
         .llvm_name = "nacl-trap",
         .description = "NaCl trap",
@@ -944,32 +958,32 @@ pub const all_features = blk: {
         .llvm_name = "armv4t",
         .description = "ARMv4t architecture",
         .dependencies = featureSet(&[_]Feature{
-            .strict_align,
             .has_v4t,
+            .strict_align,
         }),
     };
     result[@enumToInt(Feature.v5t)] = .{
         .llvm_name = "armv5t",
         .description = "ARMv5t architecture",
         .dependencies = featureSet(&[_]Feature{
-            .strict_align,
             .has_v5t,
+            .strict_align,
         }),
     };
     result[@enumToInt(Feature.v5te)] = .{
         .llvm_name = "armv5te",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .strict_align,
             .has_v5te,
+            .strict_align,
         }),
     };
     result[@enumToInt(Feature.v5tej)] = .{
         .llvm_name = "armv5tej",
         .description = "ARMv5tej architecture",
         .dependencies = featureSet(&[_]Feature{
-            .strict_align,
             .has_v5te,
+            .strict_align,
         }),
     };
     result[@enumToInt(Feature.v6)] = .{
@@ -980,18 +994,6 @@ pub const all_features = blk: {
             .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",
@@ -1010,8 +1012,20 @@ pub const all_features = blk: {
         .llvm_name = "armv6kz",
         .description = "ARMv6kz architecture",
         .dependencies = featureSet(&[_]Feature{
-            .trustzone,
             .has_v6k,
+            .trustzone,
+        }),
+    };
+    result[@enumToInt(Feature.v6m)] = .{
+        .llvm_name = "armv6-m",
+        .description = "ARMv6m architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .db,
+            .has_v6m,
+            .mclass,
+            .noarm,
+            .strict_align,
+            .thumb_mode,
         }),
     };
     result[@enumToInt(Feature.v6sm)] = .{
@@ -1019,11 +1033,11 @@ pub const all_features = blk: {
         .description = "ARMv6sm architecture",
         .dependencies = featureSet(&[_]Feature{
             .db,
+            .has_v6m,
             .mclass,
             .noarm,
             .strict_align,
             .thumb_mode,
-            .has_v6m,
         }),
     };
     result[@enumToInt(Feature.v6t2)] = .{
@@ -1041,53 +1055,51 @@ pub const all_features = blk: {
             .aclass,
             .db,
             .dsp,
-            .neon,
             .has_v7,
+            .neon,
         }),
     };
-    result[@enumToInt(Feature.v7m)] = .{
-        .llvm_name = "armv7-m",
-        .description = "ARMv7m architecture",
+    result[@enumToInt(Feature.v7em)] = .{
+        .llvm_name = "armv7e-m",
+        .description = "ARMv7em architecture",
         .dependencies = featureSet(&[_]Feature{
             .db,
+            .dsp,
+            .has_v7,
             .hwdiv,
             .mclass,
             .noarm,
             .thumb_mode,
-            .thumb2,
-            .has_v7,
         }),
     };
-    result[@enumToInt(Feature.v7r)] = .{
-        .llvm_name = "armv7-r",
-        .description = "ARMv7r architecture",
+    result[@enumToInt(Feature.v7k)] = .{
+        .llvm_name = "armv7k",
+        .description = "ARMv7a architecture",
         .dependencies = featureSet(&[_]Feature{
-            .db,
-            .dsp,
-            .hwdiv,
-            .rclass,
-            .has_v7,
+            .v7a,
         }),
     };
-    result[@enumToInt(Feature.v7em)] = .{
-        .llvm_name = "armv7e-m",
-        .description = "ARMv7em architecture",
+    result[@enumToInt(Feature.v7m)] = .{
+        .llvm_name = "armv7-m",
+        .description = "ARMv7m architecture",
         .dependencies = featureSet(&[_]Feature{
             .db,
-            .dsp,
+            .has_v7,
             .hwdiv,
             .mclass,
             .noarm,
             .thumb_mode,
-            .thumb2,
-            .has_v7,
         }),
     };
-    result[@enumToInt(Feature.v7k)] = .{
-        .llvm_name = "armv7k",
-        .description = "ARMv7a architecture",
+    result[@enumToInt(Feature.v7r)] = .{
+        .llvm_name = "armv7-r",
+        .description = "ARMv7r architecture",
         .dependencies = featureSet(&[_]Feature{
-            .v7a,
+            .db,
+            .dsp,
+            .has_v7,
+            .hwdiv,
+            .rclass,
         }),
     };
     result[@enumToInt(Feature.v7s)] = .{
@@ -1104,73 +1116,10 @@ pub const all_features = blk: {
             .aclass,
             .db,
             .dsp,
-            .mp,
-            .neon,
-            .trustzone,
             .has_v7,
-            .virtualization,
-        }),
-    };
-    result[@enumToInt(Feature.v8a)] = .{
-        .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,
-            .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,
         }),
     };
@@ -1184,10 +1133,9 @@ pub const all_features = blk: {
             .db,
             .dsp,
             .fp_armv8,
+            .has_v8_1a,
             .mp,
-            .neon,
             .trustzone,
-            .has_v8_1a,
             .virtualization,
         }),
     };
@@ -1198,13 +1146,13 @@ pub const all_features = blk: {
             .@"8msecext",
             .acquire_release,
             .db,
+            .has_v8_1m_main,
             .hwdiv,
             .lob,
             .mclass,
             .noarm,
             .ras,
             .thumb_mode,
-            .has_v8_1m_main,
         }),
     };
     result[@enumToInt(Feature.v8_2a)] = .{
@@ -1217,11 +1165,10 @@ pub const all_features = blk: {
             .db,
             .dsp,
             .fp_armv8,
+            .has_v8_2a,
             .mp,
-            .neon,
             .ras,
             .trustzone,
-            .has_v8_2a,
             .virtualization,
         }),
     };
@@ -1235,11 +1182,10 @@ pub const all_features = blk: {
             .db,
             .dsp,
             .fp_armv8,
+            .has_v8_3a,
             .mp,
-            .neon,
             .ras,
             .trustzone,
-            .has_v8_3a,
             .virtualization,
         }),
     };
@@ -1251,14 +1197,12 @@ pub const all_features = blk: {
             .crc,
             .crypto,
             .db,
-            .dotprod,
             .dsp,
             .fp_armv8,
+            .has_v8_4a,
             .mp,
-            .neon,
             .ras,
             .trustzone,
-            .has_v8_4a,
             .virtualization,
         }),
     };
@@ -1270,14 +1214,12 @@ pub const all_features = blk: {
             .crc,
             .crypto,
             .db,
-            .dotprod,
             .dsp,
             .fp_armv8,
+            .has_v8_5a,
             .mp,
-            .neon,
             .ras,
             .trustzone,
-            .has_v8_5a,
             .virtualization,
         }),
     };
@@ -1289,14 +1231,91 @@ pub const all_features = blk: {
             .crc,
             .crypto,
             .db,
-            .dotprod,
             .dsp,
             .fp_armv8,
+            .has_v8_6a,
             .mp,
-            .neon,
             .ras,
             .trustzone,
-            .has_v8_6a,
+            .virtualization,
+        }),
+    };
+    result[@enumToInt(Feature.v8_7a)] = .{
+        .llvm_name = "armv8.7-a",
+        .description = "ARMv86a architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dsp,
+            .fp_armv8,
+            .has_v8_7a,
+            .mp,
+            .ras,
+            .trustzone,
+            .virtualization,
+        }),
+    };
+    result[@enumToInt(Feature.v8a)] = .{
+        .llvm_name = "armv8-a",
+        .description = "ARMv8a architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .aclass,
+            .crc,
+            .crypto,
+            .db,
+            .dsp,
+            .fp_armv8,
+            .has_v8,
+            .mp,
+            .trustzone,
+            .virtualization,
+        }),
+    };
+    result[@enumToInt(Feature.v8m)] = .{
+        .llvm_name = "armv8-m.base",
+        .description = "ARMv8mBaseline architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .@"8msecext",
+            .acquire_release,
+            .db,
+            .has_v7clrex,
+            .has_v8m,
+            .hwdiv,
+            .mclass,
+            .noarm,
+            .strict_align,
+            .thumb_mode,
+        }),
+    };
+    result[@enumToInt(Feature.v8m_main)] = .{
+        .llvm_name = "armv8-m.main",
+        .description = "ARMv8mMainline architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .@"8msecext",
+            .acquire_release,
+            .db,
+            .has_v8m_main,
+            .hwdiv,
+            .mclass,
+            .noarm,
+            .thumb_mode,
+        }),
+    };
+    result[@enumToInt(Feature.v8r)] = .{
+        .llvm_name = "armv8-r",
+        .description = "ARMv8r architecture",
+        .dependencies = featureSet(&[_]Feature{
+            .crc,
+            .db,
+            .dfb,
+            .dsp,
+            .fp_armv8,
+            .has_v8,
+            .mp,
+            .neon,
+            .rclass,
             .virtualization,
         }),
     };
@@ -1327,7 +1346,6 @@ pub const all_features = blk: {
         .llvm_name = "vfp3d16",
         .description = "Enable VFP3 instructions with only 16 d-registers",
         .dependencies = featureSet(&[_]Feature{
-            .fp64,
             .vfp2,
             .vfp3d16sp,
         }),
@@ -1351,7 +1369,6 @@ pub const all_features = blk: {
         .llvm_name = "vfp4",
         .description = "Enable VFP4 instructions",
         .dependencies = featureSet(&[_]Feature{
-            .fp16,
             .vfp3,
             .vfp4d16,
             .vfp4sp,
@@ -1361,8 +1378,6 @@ pub const all_features = blk: {
         .llvm_name = "vfp4d16",
         .description = "Enable VFP4 instructions with only 16 d-registers",
         .dependencies = featureSet(&[_]Feature{
-            .fp16,
-            .fp64,
             .vfp3d16,
             .vfp4d16sp,
         }),
@@ -1379,8 +1394,6 @@ pub const all_features = blk: {
         .llvm_name = "vfp4sp",
         .description = "Enable VFP4 instructions with no double precision",
         .dependencies = featureSet(&[_]Feature{
-            .d32,
-            .fp16,
             .vfp3sp,
             .vfp4d16sp,
         }),
@@ -1417,7 +1430,7 @@ pub const all_features = blk: {
         .llvm_name = "xscale",
         .description = "ARMv5te architecture",
         .dependencies = featureSet(&[_]Feature{
-            .has_v5te,
+            .v5te,
         }),
     };
     result[@enumToInt(Feature.zcz)] = .{
@@ -1480,8 +1493,8 @@ pub const cpu = struct {
         .name = "arm1136jf_s",
         .llvm_name = "arm1136jf-s",
         .features = featureSet(&[_]Feature{
-            .v6,
             .slowfpvmlx,
+            .v6,
             .vfp2,
         }),
     };
@@ -1496,8 +1509,8 @@ pub const cpu = struct {
         .name = "arm1156t2f_s",
         .llvm_name = "arm1156t2f-s",
         .features = featureSet(&[_]Feature{
-            .v6t2,
             .slowfpvmlx,
+            .v6t2,
             .vfp2,
         }),
     };
@@ -1519,8 +1532,8 @@ pub const cpu = struct {
         .name = "arm1176jzf_s",
         .llvm_name = "arm1176jzf-s",
         .features = featureSet(&[_]Feature{
-            .v6kz,
             .slowfpvmlx,
+            .v6kz,
             .vfp2,
         }),
     };
@@ -1654,11 +1667,11 @@ pub const cpu = struct {
         .name = "cortex_a12",
         .llvm_name = "cortex-a12",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .avoid_partial_cpsr,
             .mp,
             .ret_addr_stack,
             .trustzone,
+            .v7a,
             .vfp4,
             .virtualization,
             .vmlx_forwarding,
@@ -1668,14 +1681,13 @@ pub const cpu = struct {
         .name = "cortex_a15",
         .llvm_name = "cortex-a15",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .avoid_partial_cpsr,
-            .dont_widen_vmovs,
             .mp,
             .muxed_units,
             .ret_addr_stack,
             .splat_vfp_neon,
             .trustzone,
+            .v7a,
             .vfp4,
             .virtualization,
             .vldn_align,
@@ -1685,11 +1697,11 @@ pub const cpu = struct {
         .name = "cortex_a17",
         .llvm_name = "cortex-a17",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .avoid_partial_cpsr,
             .mp,
             .ret_addr_stack,
             .trustzone,
+            .v7a,
             .vfp4,
             .virtualization,
             .vmlx_forwarding,
@@ -1699,10 +1711,6 @@ pub const cpu = struct {
         .name = "cortex_a32",
         .llvm_name = "cortex-a32",
         .features = featureSet(&[_]Feature{
-            .crc,
-            .crypto,
-            .hwdiv,
-            .hwdiv_arm,
             .v8a,
         }),
     };
@@ -1710,10 +1718,6 @@ pub const cpu = struct {
         .name = "cortex_a35",
         .llvm_name = "cortex-a35",
         .features = featureSet(&[_]Feature{
-            .crc,
-            .crypto,
-            .hwdiv,
-            .hwdiv_arm,
             .v8a,
         }),
     };
@@ -1721,13 +1725,13 @@ pub const cpu = struct {
         .name = "cortex_a5",
         .llvm_name = "cortex-a5",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .mp,
             .ret_addr_stack,
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
             .trustzone,
+            .v7a,
             .vfp4,
             .vmlx_forwarding,
         }),
@@ -1736,49 +1740,39 @@ pub const cpu = struct {
         .name = "cortex_a53",
         .llvm_name = "cortex-a53",
         .features = featureSet(&[_]Feature{
-            .v8a,
-            .crc,
-            .crypto,
             .fpao,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8a,
         }),
     };
     pub const cortex_a55 = CpuModel{
         .name = "cortex_a55",
         .llvm_name = "cortex-a55",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
             .dotprod,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cortex_a57 = CpuModel{
         .name = "cortex_a57",
         .llvm_name = "cortex-a57",
         .features = featureSet(&[_]Feature{
-            .v8a,
             .avoid_partial_cpsr,
             .cheap_predicable_cpsr,
-            .crc,
-            .crypto,
             .fpao,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8a,
         }),
     };
     pub const cortex_a7 = CpuModel{
         .name = "cortex_a7",
         .llvm_name = "cortex-a7",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .mp,
             .ret_addr_stack,
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
             .trustzone,
+            .v7a,
             .vfp4,
             .virtualization,
             .vmlx_forwarding,
@@ -1790,10 +1784,6 @@ pub const cpu = struct {
         .llvm_name = "cortex-a72",
         .features = featureSet(&[_]Feature{
             .v8a,
-            .crc,
-            .crypto,
-            .hwdiv,
-            .hwdiv_arm,
         }),
     };
     pub const cortex_a73 = CpuModel{
@@ -1801,20 +1791,14 @@ pub const cpu = struct {
         .llvm_name = "cortex-a73",
         .features = featureSet(&[_]Feature{
             .v8a,
-            .crc,
-            .crypto,
-            .hwdiv,
-            .hwdiv_arm,
         }),
     };
     pub const cortex_a75 = CpuModel{
         .name = "cortex_a75",
         .llvm_name = "cortex-a75",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
             .dotprod,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cortex_a76 = CpuModel{
@@ -1822,13 +1806,9 @@ pub const cpu = struct {
         .llvm_name = "cortex-a76",
         .features = featureSet(&[_]Feature{
             .a76,
-            .v8_2a,
-            .crc,
-            .crypto,
             .dotprod,
             .fullfp16,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cortex_a76ae = CpuModel{
@@ -1836,52 +1816,49 @@ pub const cpu = struct {
         .llvm_name = "cortex-a76ae",
         .features = featureSet(&[_]Feature{
             .a76,
-            .v8_2a,
-            .crc,
-            .crypto,
             .dotprod,
             .fullfp16,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cortex_a77 = CpuModel{
         .name = "cortex_a77",
         .llvm_name = "cortex-a77",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
-            .crc,
-            .crypto,
             .dotprod,
             .fullfp16,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cortex_a78 = CpuModel{
         .name = "cortex_a78",
         .llvm_name = "cortex-a78",
         .features = featureSet(&[_]Feature{
+            .dotprod,
+            .fullfp16,
             .v8_2a,
-            .crc,
-            .crypto,
+        }),
+    };
+    pub const cortex_a78c = CpuModel{
+        .name = "cortex_a78c",
+        .llvm_name = "cortex-a78c",
+        .features = featureSet(&[_]Feature{
             .dotprod,
             .fullfp16,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cortex_a8 = CpuModel{
         .name = "cortex_a8",
         .llvm_name = "cortex-a8",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .nonpipelined_vfp,
             .ret_addr_stack,
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
             .trustzone,
+            .v7a,
             .vmlx_forwarding,
             .vmlx_hazards,
         }),
@@ -1890,7 +1867,6 @@ pub const cpu = struct {
         .name = "cortex_a9",
         .llvm_name = "cortex-a9",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .avoid_partial_cpsr,
             .expand_fp_mlx,
             .fp16,
@@ -1900,6 +1876,7 @@ pub const cpu = struct {
             .prefer_vmovsr,
             .ret_addr_stack,
             .trustzone,
+            .v7a,
             .vldn_align,
             .vmlx_forwarding,
             .vmlx_hazards,
@@ -1930,26 +1907,25 @@ pub const cpu = struct {
         .name = "cortex_m23",
         .llvm_name = "cortex-m23",
         .features = featureSet(&[_]Feature{
-            .v8m,
             .no_movt,
+            .v8m,
         }),
     };
     pub const cortex_m3 = CpuModel{
         .name = "cortex_m3",
         .llvm_name = "cortex-m3",
         .features = featureSet(&[_]Feature{
-            .v7m,
             .loop_align,
             .m3,
             .no_branch_predictor,
             .use_misched,
+            .v7m,
         }),
     };
     pub const cortex_m33 = CpuModel{
         .name = "cortex_m33",
         .llvm_name = "cortex-m33",
         .features = featureSet(&[_]Feature{
-            .v8m_main,
             .dsp,
             .fp_armv8d16sp,
             .loop_align,
@@ -1957,13 +1933,13 @@ pub const cpu = struct {
             .slowfpvfmx,
             .slowfpvmlx,
             .use_misched,
+            .v8m_main,
         }),
     };
     pub const cortex_m35p = CpuModel{
         .name = "cortex_m35p",
         .llvm_name = "cortex-m35p",
         .features = featureSet(&[_]Feature{
-            .v8m_main,
             .dsp,
             .fp_armv8d16sp,
             .loop_align,
@@ -1971,18 +1947,19 @@ pub const cpu = struct {
             .slowfpvfmx,
             .slowfpvmlx,
             .use_misched,
+            .v8m_main,
         }),
     };
     pub const cortex_m4 = CpuModel{
         .name = "cortex_m4",
         .llvm_name = "cortex-m4",
         .features = featureSet(&[_]Feature{
-            .v7em,
             .loop_align,
             .no_branch_predictor,
             .slowfpvfmx,
             .slowfpvmlx,
             .use_misched,
+            .v7em,
             .vfp4d16sp,
         }),
     };
@@ -1990,45 +1967,45 @@ pub const cpu = struct {
         .name = "cortex_m55",
         .llvm_name = "cortex-m55",
         .features = featureSet(&[_]Feature{
-            .v8_1m_main,
-            .dsp,
             .fp_armv8d16,
             .loop_align,
             .mve_fp,
             .no_branch_predictor,
             .slowfpvmlx,
             .use_misched,
+            .v8_1m_main,
         }),
     };
     pub const cortex_m7 = CpuModel{
         .name = "cortex_m7",
         .llvm_name = "cortex-m7",
         .features = featureSet(&[_]Feature{
-            .v7em,
             .fp_armv8d16,
+            .use_misched,
+            .v7em,
         }),
     };
     pub const cortex_r4 = CpuModel{
         .name = "cortex_r4",
         .llvm_name = "cortex-r4",
         .features = featureSet(&[_]Feature{
-            .v7r,
             .avoid_partial_cpsr,
             .r4,
             .ret_addr_stack,
+            .v7r,
         }),
     };
     pub const cortex_r4f = CpuModel{
         .name = "cortex_r4f",
         .llvm_name = "cortex-r4f",
         .features = featureSet(&[_]Feature{
-            .v7r,
             .avoid_partial_cpsr,
             .r4,
             .ret_addr_stack,
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
+            .v7r,
             .vfp3d16,
         }),
     };
@@ -2036,13 +2013,13 @@ pub const cpu = struct {
         .name = "cortex_r5",
         .llvm_name = "cortex-r5",
         .features = featureSet(&[_]Feature{
-            .v7r,
             .avoid_partial_cpsr,
             .hwdiv_arm,
             .ret_addr_stack,
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
+            .v7r,
             .vfp3d16,
         }),
     };
@@ -2050,16 +2027,15 @@ pub const cpu = struct {
         .name = "cortex_r52",
         .llvm_name = "cortex-r52",
         .features = featureSet(&[_]Feature{
-            .v8r,
             .fpao,
             .use_misched,
+            .v8r,
         }),
     };
     pub const cortex_r7 = CpuModel{
         .name = "cortex_r7",
         .llvm_name = "cortex-r7",
         .features = featureSet(&[_]Feature{
-            .v7r,
             .avoid_partial_cpsr,
             .fp16,
             .hwdiv_arm,
@@ -2068,6 +2044,7 @@ pub const cpu = struct {
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
+            .v7r,
             .vfp3d16,
         }),
     };
@@ -2075,7 +2052,6 @@ pub const cpu = struct {
         .name = "cortex_r8",
         .llvm_name = "cortex-r8",
         .features = featureSet(&[_]Feature{
-            .v7r,
             .avoid_partial_cpsr,
             .fp16,
             .hwdiv_arm,
@@ -2084,6 +2060,7 @@ pub const cpu = struct {
             .slow_fp_brcc,
             .slowfpvfmx,
             .slowfpvmlx,
+            .v7r,
             .vfp3d16,
         }),
     };
@@ -2091,34 +2068,25 @@ pub const cpu = struct {
         .name = "cortex_x1",
         .llvm_name = "cortex-x1",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
-            .crc,
-            .crypto,
             .dotprod,
             .fullfp16,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const cyclone = CpuModel{
         .name = "cyclone",
         .llvm_name = "cyclone",
         .features = featureSet(&[_]Feature{
-            .v8a,
             .avoid_movs_shop,
             .avoid_partial_cpsr,
-            .crypto,
             .disable_postra_scheduler,
-            .hwdiv,
-            .hwdiv_arm,
-            .mp,
             .neonfp,
             .ret_addr_stack,
             .slowfpvfmx,
             .slowfpvmlx,
             .swift,
             .use_misched,
-            .vfp4,
+            .v8a,
             .zcz,
         }),
     };
@@ -2133,34 +2101,34 @@ pub const cpu = struct {
         .name = "exynos_m1",
         .llvm_name = null,
         .features = featureSet(&[_]Feature{
-            .v8a,
             .exynos,
+            .v8a,
         }),
     };
     pub const exynos_m2 = CpuModel{
         .name = "exynos_m2",
         .llvm_name = null,
         .features = featureSet(&[_]Feature{
-            .v8a,
             .exynos,
+            .v8a,
         }),
     };
     pub const exynos_m3 = CpuModel{
         .name = "exynos_m3",
         .llvm_name = "exynos-m3",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
             .exynos,
+            .v8a,
         }),
     };
     pub const exynos_m4 = CpuModel{
         .name = "exynos_m4",
         .llvm_name = "exynos-m4",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
             .dotprod,
             .exynos,
             .fullfp16,
+            .v8_2a,
         }),
     };
     pub const exynos_m5 = CpuModel{
@@ -2190,7 +2158,6 @@ pub const cpu = struct {
         .llvm_name = "krait",
         .features = featureSet(&[_]Feature{
             .avoid_partial_cpsr,
-            .fp16,
             .hwdiv,
             .hwdiv_arm,
             .muxed_units,
@@ -2205,10 +2172,6 @@ pub const cpu = struct {
         .name = "kryo",
         .llvm_name = "kryo",
         .features = featureSet(&[_]Feature{
-            .crc,
-            .crypto,
-            .hwdiv,
-            .hwdiv_arm,
             .v8a,
         }),
     };
@@ -2216,8 +2179,8 @@ pub const cpu = struct {
         .name = "mpcore",
         .llvm_name = "mpcore",
         .features = featureSet(&[_]Feature{
-            .v6k,
             .slowfpvmlx,
+            .v6k,
             .vfp2,
         }),
     };
@@ -2232,36 +2195,27 @@ pub const cpu = struct {
         .name = "neoverse_n1",
         .llvm_name = "neoverse-n1",
         .features = featureSet(&[_]Feature{
-            .v8_2a,
-            .crc,
-            .crypto,
             .dotprod,
-            .hwdiv,
-            .hwdiv_arm,
+            .v8_2a,
         }),
     };
     pub const neoverse_n2 = CpuModel{
         .name = "neoverse_n2",
         .llvm_name = "neoverse-n2",
         .features = featureSet(&[_]Feature{
-            .v8_5a,
             .bf16,
             .i8mm,
-            .perfmon,
+            .v8_5a,
         }),
     };
     pub const neoverse_v1 = CpuModel{
         .name = "neoverse_v1",
         .llvm_name = "neoverse-v1",
         .features = featureSet(&[_]Feature{
-            .v8_4a,
             .bf16,
-            .crc,
-            .crypto,
             .fullfp16,
-            .hwdiv,
-            .hwdiv_arm,
             .i8mm,
+            .v8_4a,
         }),
     };
     pub const sc000 = CpuModel{
@@ -2275,10 +2229,10 @@ pub const cpu = struct {
         .name = "sc300",
         .llvm_name = "sc300",
         .features = featureSet(&[_]Feature{
-            .v7m,
             .m3,
             .no_branch_predictor,
             .use_misched,
+            .v7m,
         }),
     };
     pub const strongarm = CpuModel{
@@ -2313,7 +2267,6 @@ pub const cpu = struct {
         .name = "swift",
         .llvm_name = "swift",
         .features = featureSet(&[_]Feature{
-            .v7a,
             .avoid_movs_shop,
             .avoid_partial_cpsr,
             .disable_postra_scheduler,
@@ -2332,6 +2285,7 @@ pub const cpu = struct {
             .slowfpvmlx,
             .swift,
             .use_misched,
+            .v7a,
             .vfp4,
             .vmlx_hazards,
             .wide_stride_vfp,
tools/update_cpu_features.zig
@@ -266,6 +266,358 @@ const llvm_targets = [_]LlvmTarget{
         .llvm_name = "ARM",
         .td_name = "ARM.td",
         .branch_quota = 10000,
+        .extra_cpus = &.{
+            .{
+                .llvm_name = "generic",
+                .zig_name = "baseline",
+                .features = &.{"v7a"},
+            },
+            .{
+                .llvm_name = null,
+                .zig_name = "exynos_m1",
+                .features = &.{ "v8a", "exynos" },
+            },
+            .{
+                .llvm_name = null,
+                .zig_name = "exynos_m2",
+                .features = &.{ "v8a", "exynos" },
+            },
+        },
+        .feature_overrides = &.{
+            .{
+                .llvm_name = "cortex-a78",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "r5",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "r52",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "r7",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "m7",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "krait",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "kryo",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "cortex-x1",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "neoverse-v1",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a5",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a7",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a8",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a9",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a12",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a15",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a17",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a32",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a35",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a53",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a55",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a57",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a72",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a73",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a75",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a77",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "a78c",
+                .flatten = true,
+            },
+            .{
+                .llvm_name = "armv2",
+                .zig_name = "v2",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv2a",
+                .zig_name = "v2a",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv3",
+                .zig_name = "v3",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv3m",
+                .zig_name = "v3m",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv4",
+                .zig_name = "v4",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv4t",
+                .zig_name = "v4t",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv5t",
+                .zig_name = "v5t",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv5te",
+                .zig_name = "v5te",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv5tej",
+                .zig_name = "v5tej",
+                .extra_deps = &.{"strict_align"},
+            },
+            .{
+                .llvm_name = "armv6",
+                .zig_name = "v6",
+            },
+            .{
+                .llvm_name = "armv6-m",
+                .zig_name = "v6m",
+            },
+            .{
+                .llvm_name = "armv6j",
+                .zig_name = "v6j",
+            },
+            .{
+                .llvm_name = "armv6k",
+                .zig_name = "v6k",
+            },
+            .{
+                .llvm_name = "armv6kz",
+                .zig_name = "v6kz",
+            },
+            .{
+                .llvm_name = "armv6s-m",
+                .zig_name = "v6sm",
+            },
+            .{
+                .llvm_name = "armv6t2",
+                .zig_name = "v6t2",
+            },
+            .{
+                .llvm_name = "armv7-a",
+                .zig_name = "v7a",
+            },
+            .{
+                .llvm_name = "armv7-m",
+                .zig_name = "v7m",
+            },
+            .{
+                .llvm_name = "armv7-r",
+                .zig_name = "v7r",
+            },
+            .{
+                .llvm_name = "armv7e-m",
+                .zig_name = "v7em",
+            },
+            .{
+                .llvm_name = "armv7k",
+                .zig_name = "v7k",
+            },
+            .{
+                .llvm_name = "armv7s",
+                .zig_name = "v7s",
+            },
+            .{
+                .llvm_name = "armv7ve",
+                .zig_name = "v7ve",
+            },
+            .{
+                .llvm_name = "armv8.1-a",
+                .zig_name = "v8_1a",
+            },
+            .{
+                .llvm_name = "armv8.1-m.main",
+                .zig_name = "v8_1m_main",
+            },
+            .{
+                .llvm_name = "armv8.2-a",
+                .zig_name = "v8_2a",
+            },
+            .{
+                .llvm_name = "armv8.3-a",
+                .zig_name = "v8_3a",
+            },
+            .{
+                .llvm_name = "armv8.4-a",
+                .zig_name = "v8_4a",
+            },
+            .{
+                .llvm_name = "armv8.5-a",
+                .zig_name = "v8_5a",
+            },
+            .{
+                .llvm_name = "armv8.6-a",
+                .zig_name = "v8_6a",
+            },
+            .{
+                .llvm_name = "armv8.7-a",
+                .zig_name = "v8_7a",
+            },
+            .{
+                .llvm_name = "armv8-a",
+                .zig_name = "v8a",
+            },
+            .{
+                .llvm_name = "armv8-m.base",
+                .zig_name = "v8m",
+            },
+            .{
+                .llvm_name = "armv8-m.main",
+                .zig_name = "v8m_main",
+            },
+            .{
+                .llvm_name = "armv8-r",
+                .zig_name = "v8r",
+            },
+            .{
+                .llvm_name = "v4t",
+                .zig_name = "has_v4t",
+            },
+            .{
+                .llvm_name = "v5t",
+                .zig_name = "has_v5t",
+            },
+            .{
+                .llvm_name = "v5te",
+                .zig_name = "has_v5te",
+            },
+            .{
+                .llvm_name = "v6",
+                .zig_name = "has_v6",
+            },
+            .{
+                .llvm_name = "v6k",
+                .zig_name = "has_v6k",
+            },
+            .{
+                .llvm_name = "v6m",
+                .zig_name = "has_v6m",
+            },
+            .{
+                .llvm_name = "v6t2",
+                .zig_name = "has_v6t2",
+            },
+            .{
+                .llvm_name = "v7",
+                .zig_name = "has_v7",
+            },
+            .{
+                .llvm_name = "v7clrex",
+                .zig_name = "has_v7clrex",
+            },
+            .{
+                .llvm_name = "v8",
+                .zig_name = "has_v8",
+            },
+            .{
+                .llvm_name = "v8m",
+                .zig_name = "has_v8m",
+            },
+            .{
+                .llvm_name = "v8m.main",
+                .zig_name = "has_v8m_main",
+            },
+            .{
+                .llvm_name = "v8.1a",
+                .zig_name = "has_v8_1a",
+            },
+            .{
+                .llvm_name = "v8.1m.main",
+                .zig_name = "has_v8_1m_main",
+            },
+            .{
+                .llvm_name = "v8.2a",
+                .zig_name = "has_v8_2a",
+            },
+            .{
+                .llvm_name = "v8.3a",
+                .zig_name = "has_v8_3a",
+            },
+            .{
+                .llvm_name = "v8.4a",
+                .zig_name = "has_v8_4a",
+            },
+            .{
+                .llvm_name = "v8.5a",
+                .zig_name = "has_v8_5a",
+            },
+            .{
+                .llvm_name = "v8.6a",
+                .zig_name = "has_v8_6a",
+            },
+            .{
+                .llvm_name = "v8.7a",
+                .zig_name = "has_v8_7a",
+            },
+        },
     },
     .{
         .zig_name = "avr",