master
   1//! This file is auto-generated by tools/update_cpu_features.zig.
   2
   3const std = @import("../std.zig");
   4const CpuFeature = std.Target.Cpu.Feature;
   5const CpuModel = std.Target.Cpu.Model;
   6
   7pub const Feature = enum {
   8    @"32bit",
   9    @"8msecext",
  10    aapcs_frame_chain,
  11    aclass,
  12    acquire_release,
  13    aes,
  14    atomics_32,
  15    avoid_movs_shop,
  16    avoid_muls,
  17    avoid_partial_cpsr,
  18    bf16,
  19    big_endian_instructions,
  20    branch_align_64,
  21    cde,
  22    cdecp0,
  23    cdecp1,
  24    cdecp2,
  25    cdecp3,
  26    cdecp4,
  27    cdecp5,
  28    cdecp6,
  29    cdecp7,
  30    cheap_predicable_cpsr,
  31    clrbhb,
  32    cortex_a510,
  33    crc,
  34    crypto,
  35    d32,
  36    db,
  37    dfb,
  38    disable_postra_scheduler,
  39    dont_widen_vmovs,
  40    dotprod,
  41    dsp,
  42    execute_only,
  43    expand_fp_mlx,
  44    fix_cmse_cve_2021_35465,
  45    fix_cortex_a57_aes_1742098,
  46    fp16,
  47    fp16fml,
  48    fp64,
  49    fp_armv8,
  50    fp_armv8d16,
  51    fp_armv8d16sp,
  52    fp_armv8sp,
  53    fpao,
  54    fpregs,
  55    fpregs16,
  56    fpregs64,
  57    fullfp16,
  58    fuse_aes,
  59    fuse_literals,
  60    harden_sls_blr,
  61    harden_sls_nocomdat,
  62    harden_sls_retbr,
  63    has_v4t,
  64    has_v5t,
  65    has_v5te,
  66    has_v6,
  67    has_v6k,
  68    has_v6m,
  69    has_v6t2,
  70    has_v7,
  71    has_v7clrex,
  72    has_v8,
  73    has_v8_1a,
  74    has_v8_1m_main,
  75    has_v8_2a,
  76    has_v8_3a,
  77    has_v8_4a,
  78    has_v8_5a,
  79    has_v8_6a,
  80    has_v8_7a,
  81    has_v8_8a,
  82    has_v8_9a,
  83    has_v8m,
  84    has_v8m_main,
  85    has_v9_1a,
  86    has_v9_2a,
  87    has_v9_3a,
  88    has_v9_4a,
  89    has_v9_5a,
  90    has_v9_6a,
  91    has_v9a,
  92    hwdiv,
  93    hwdiv_arm,
  94    i8mm,
  95    iwmmxt,
  96    iwmmxt2,
  97    lob,
  98    long_calls,
  99    loop_align,
 100    m55,
 101    m85,
 102    mclass,
 103    mp,
 104    muxed_units,
 105    mve,
 106    mve1beat,
 107    mve2beat,
 108    mve4beat,
 109    mve_fp,
 110    nacl_trap,
 111    neon,
 112    neon_fpmovs,
 113    neonfp,
 114    no_branch_predictor,
 115    no_bti_at_return_twice,
 116    no_movt,
 117    no_neg_immediates,
 118    noarm,
 119    nonpipelined_vfp,
 120    pacbti,
 121    perfmon,
 122    prefer_ishst,
 123    prefer_vmovsr,
 124    prof_unpr,
 125    ras,
 126    rclass,
 127    read_tp_tpidrprw,
 128    read_tp_tpidruro,
 129    read_tp_tpidrurw,
 130    reserve_r9,
 131    ret_addr_stack,
 132    sb,
 133    sha2,
 134    slow_fp_brcc,
 135    slow_load_D_subreg,
 136    slow_odd_reg,
 137    slow_vdup32,
 138    slow_vgetlni32,
 139    slowfpvfmx,
 140    slowfpvmlx,
 141    soft_float,
 142    splat_vfp_neon,
 143    strict_align,
 144    thumb2,
 145    thumb_mode,
 146    trustzone,
 147    use_mipipeliner,
 148    use_misched,
 149    v2,
 150    v2a,
 151    v3,
 152    v3m,
 153    v4,
 154    v4t,
 155    v5t,
 156    v5te,
 157    v5tej,
 158    v6,
 159    v6j,
 160    v6k,
 161    v6kz,
 162    v6m,
 163    v6sm,
 164    v6t2,
 165    v7a,
 166    v7em,
 167    v7m,
 168    v7r,
 169    v7ve,
 170    v8_1a,
 171    v8_1m_main,
 172    v8_2a,
 173    v8_3a,
 174    v8_4a,
 175    v8_5a,
 176    v8_6a,
 177    v8_7a,
 178    v8_8a,
 179    v8_9a,
 180    v8a,
 181    v8m,
 182    v8m_main,
 183    v8r,
 184    v9_1a,
 185    v9_2a,
 186    v9_3a,
 187    v9_4a,
 188    v9_5a,
 189    v9_6a,
 190    v9a,
 191    vfp2,
 192    vfp2sp,
 193    vfp3,
 194    vfp3d16,
 195    vfp3d16sp,
 196    vfp3sp,
 197    vfp4,
 198    vfp4d16,
 199    vfp4d16sp,
 200    vfp4sp,
 201    virtualization,
 202    vldn_align,
 203    vmlx_forwarding,
 204    vmlx_hazards,
 205    wide_stride_vfp,
 206    xscale,
 207    zcz,
 208};
 209
 210pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
 211pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas;
 212pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny;
 213pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll;
 214
 215pub const all_features = blk: {
 216    @setEvalBranchQuota(10000);
 217    const len = @typeInfo(Feature).@"enum".fields.len;
 218    std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
 219    var result: [len]CpuFeature = undefined;
 220    result[@intFromEnum(Feature.@"32bit")] = .{
 221        .llvm_name = "32bit",
 222        .description = "Prefer 32-bit Thumb instrs",
 223        .dependencies = featureSet(&[_]Feature{}),
 224    };
 225    result[@intFromEnum(Feature.@"8msecext")] = .{
 226        .llvm_name = "8msecext",
 227        .description = "Enable support for ARMv8-M Security Extensions",
 228        .dependencies = featureSet(&[_]Feature{}),
 229    };
 230    result[@intFromEnum(Feature.aapcs_frame_chain)] = .{
 231        .llvm_name = "aapcs-frame-chain",
 232        .description = "Create an AAPCS compliant frame chain",
 233        .dependencies = featureSet(&[_]Feature{}),
 234    };
 235    result[@intFromEnum(Feature.aclass)] = .{
 236        .llvm_name = "aclass",
 237        .description = "Is application profile ('A' series)",
 238        .dependencies = featureSet(&[_]Feature{}),
 239    };
 240    result[@intFromEnum(Feature.acquire_release)] = .{
 241        .llvm_name = "acquire-release",
 242        .description = "Has v8 acquire/release (lda/ldaex  etc) instructions",
 243        .dependencies = featureSet(&[_]Feature{}),
 244    };
 245    result[@intFromEnum(Feature.aes)] = .{
 246        .llvm_name = "aes",
 247        .description = "Enable AES support",
 248        .dependencies = featureSet(&[_]Feature{
 249            .neon,
 250        }),
 251    };
 252    result[@intFromEnum(Feature.atomics_32)] = .{
 253        .llvm_name = "atomics-32",
 254        .description = "Assume that lock-free 32-bit atomics are available",
 255        .dependencies = featureSet(&[_]Feature{}),
 256    };
 257    result[@intFromEnum(Feature.avoid_movs_shop)] = .{
 258        .llvm_name = "avoid-movs-shop",
 259        .description = "Avoid movs instructions with shifter operand",
 260        .dependencies = featureSet(&[_]Feature{}),
 261    };
 262    result[@intFromEnum(Feature.avoid_muls)] = .{
 263        .llvm_name = "avoid-muls",
 264        .description = "Avoid MULS instructions for M class cores",
 265        .dependencies = featureSet(&[_]Feature{}),
 266    };
 267    result[@intFromEnum(Feature.avoid_partial_cpsr)] = .{
 268        .llvm_name = "avoid-partial-cpsr",
 269        .description = "Avoid CPSR partial update for OOO execution",
 270        .dependencies = featureSet(&[_]Feature{}),
 271    };
 272    result[@intFromEnum(Feature.bf16)] = .{
 273        .llvm_name = "bf16",
 274        .description = "Enable support for BFloat16 instructions",
 275        .dependencies = featureSet(&[_]Feature{
 276            .neon,
 277        }),
 278    };
 279    result[@intFromEnum(Feature.big_endian_instructions)] = .{
 280        .llvm_name = "big-endian-instructions",
 281        .description = "Expect instructions to be stored big-endian.",
 282        .dependencies = featureSet(&[_]Feature{}),
 283    };
 284    result[@intFromEnum(Feature.branch_align_64)] = .{
 285        .llvm_name = "branch-align-64",
 286        .description = "Prefer 64-bit alignment for branch targets",
 287        .dependencies = featureSet(&[_]Feature{}),
 288    };
 289    result[@intFromEnum(Feature.cde)] = .{
 290        .llvm_name = "cde",
 291        .description = "Support CDE instructions",
 292        .dependencies = featureSet(&[_]Feature{
 293            .has_v8m_main,
 294        }),
 295    };
 296    result[@intFromEnum(Feature.cdecp0)] = .{
 297        .llvm_name = "cdecp0",
 298        .description = "Coprocessor 0 ISA is CDEv1",
 299        .dependencies = featureSet(&[_]Feature{
 300            .cde,
 301        }),
 302    };
 303    result[@intFromEnum(Feature.cdecp1)] = .{
 304        .llvm_name = "cdecp1",
 305        .description = "Coprocessor 1 ISA is CDEv1",
 306        .dependencies = featureSet(&[_]Feature{
 307            .cde,
 308        }),
 309    };
 310    result[@intFromEnum(Feature.cdecp2)] = .{
 311        .llvm_name = "cdecp2",
 312        .description = "Coprocessor 2 ISA is CDEv1",
 313        .dependencies = featureSet(&[_]Feature{
 314            .cde,
 315        }),
 316    };
 317    result[@intFromEnum(Feature.cdecp3)] = .{
 318        .llvm_name = "cdecp3",
 319        .description = "Coprocessor 3 ISA is CDEv1",
 320        .dependencies = featureSet(&[_]Feature{
 321            .cde,
 322        }),
 323    };
 324    result[@intFromEnum(Feature.cdecp4)] = .{
 325        .llvm_name = "cdecp4",
 326        .description = "Coprocessor 4 ISA is CDEv1",
 327        .dependencies = featureSet(&[_]Feature{
 328            .cde,
 329        }),
 330    };
 331    result[@intFromEnum(Feature.cdecp5)] = .{
 332        .llvm_name = "cdecp5",
 333        .description = "Coprocessor 5 ISA is CDEv1",
 334        .dependencies = featureSet(&[_]Feature{
 335            .cde,
 336        }),
 337    };
 338    result[@intFromEnum(Feature.cdecp6)] = .{
 339        .llvm_name = "cdecp6",
 340        .description = "Coprocessor 6 ISA is CDEv1",
 341        .dependencies = featureSet(&[_]Feature{
 342            .cde,
 343        }),
 344    };
 345    result[@intFromEnum(Feature.cdecp7)] = .{
 346        .llvm_name = "cdecp7",
 347        .description = "Coprocessor 7 ISA is CDEv1",
 348        .dependencies = featureSet(&[_]Feature{
 349            .cde,
 350        }),
 351    };
 352    result[@intFromEnum(Feature.cheap_predicable_cpsr)] = .{
 353        .llvm_name = "cheap-predicable-cpsr",
 354        .description = "Disable +1 predication cost for instructions updating CPSR",
 355        .dependencies = featureSet(&[_]Feature{}),
 356    };
 357    result[@intFromEnum(Feature.clrbhb)] = .{
 358        .llvm_name = "clrbhb",
 359        .description = "Enable Clear BHB instruction",
 360        .dependencies = featureSet(&[_]Feature{}),
 361    };
 362    result[@intFromEnum(Feature.cortex_a510)] = .{
 363        .llvm_name = "cortex-a510",
 364        .description = "Cortex-A510 ARM processors",
 365        .dependencies = featureSet(&[_]Feature{}),
 366    };
 367    result[@intFromEnum(Feature.crc)] = .{
 368        .llvm_name = "crc",
 369        .description = "Enable support for CRC instructions",
 370        .dependencies = featureSet(&[_]Feature{}),
 371    };
 372    result[@intFromEnum(Feature.crypto)] = .{
 373        .llvm_name = "crypto",
 374        .description = "Enable support for Cryptography extensions",
 375        .dependencies = featureSet(&[_]Feature{
 376            .aes,
 377            .sha2,
 378        }),
 379    };
 380    result[@intFromEnum(Feature.d32)] = .{
 381        .llvm_name = "d32",
 382        .description = "Extend FP to 32 double registers",
 383        .dependencies = featureSet(&[_]Feature{}),
 384    };
 385    result[@intFromEnum(Feature.db)] = .{
 386        .llvm_name = "db",
 387        .description = "Has data barrier (dmb/dsb) instructions",
 388        .dependencies = featureSet(&[_]Feature{}),
 389    };
 390    result[@intFromEnum(Feature.dfb)] = .{
 391        .llvm_name = "dfb",
 392        .description = "Has full data barrier (dfb) instruction",
 393        .dependencies = featureSet(&[_]Feature{}),
 394    };
 395    result[@intFromEnum(Feature.disable_postra_scheduler)] = .{
 396        .llvm_name = "disable-postra-scheduler",
 397        .description = "Don't schedule again after register allocation",
 398        .dependencies = featureSet(&[_]Feature{}),
 399    };
 400    result[@intFromEnum(Feature.dont_widen_vmovs)] = .{
 401        .llvm_name = "dont-widen-vmovs",
 402        .description = "Don't widen VMOVS to VMOVD",
 403        .dependencies = featureSet(&[_]Feature{}),
 404    };
 405    result[@intFromEnum(Feature.dotprod)] = .{
 406        .llvm_name = "dotprod",
 407        .description = "Enable support for dot product instructions",
 408        .dependencies = featureSet(&[_]Feature{
 409            .neon,
 410        }),
 411    };
 412    result[@intFromEnum(Feature.dsp)] = .{
 413        .llvm_name = "dsp",
 414        .description = "Supports DSP instructions in ARM and/or Thumb2",
 415        .dependencies = featureSet(&[_]Feature{}),
 416    };
 417    result[@intFromEnum(Feature.execute_only)] = .{
 418        .llvm_name = "execute-only",
 419        .description = "Enable the generation of execute only code.",
 420        .dependencies = featureSet(&[_]Feature{}),
 421    };
 422    result[@intFromEnum(Feature.expand_fp_mlx)] = .{
 423        .llvm_name = "expand-fp-mlx",
 424        .description = "Expand VFP/NEON MLA/MLS instructions",
 425        .dependencies = featureSet(&[_]Feature{}),
 426    };
 427    result[@intFromEnum(Feature.fix_cmse_cve_2021_35465)] = .{
 428        .llvm_name = "fix-cmse-cve-2021-35465",
 429        .description = "Mitigate against the cve-2021-35465 security vulnurability",
 430        .dependencies = featureSet(&[_]Feature{}),
 431    };
 432    result[@intFromEnum(Feature.fix_cortex_a57_aes_1742098)] = .{
 433        .llvm_name = "fix-cortex-a57-aes-1742098",
 434        .description = "Work around Cortex-A57 Erratum 1742098 / Cortex-A72 Erratum 1655431 (AES)",
 435        .dependencies = featureSet(&[_]Feature{}),
 436    };
 437    result[@intFromEnum(Feature.fp16)] = .{
 438        .llvm_name = "fp16",
 439        .description = "Enable half-precision floating point",
 440        .dependencies = featureSet(&[_]Feature{}),
 441    };
 442    result[@intFromEnum(Feature.fp16fml)] = .{
 443        .llvm_name = "fp16fml",
 444        .description = "Enable full half-precision floating point fml instructions",
 445        .dependencies = featureSet(&[_]Feature{
 446            .fullfp16,
 447        }),
 448    };
 449    result[@intFromEnum(Feature.fp64)] = .{
 450        .llvm_name = "fp64",
 451        .description = "Floating point unit supports double precision",
 452        .dependencies = featureSet(&[_]Feature{
 453            .fpregs64,
 454        }),
 455    };
 456    result[@intFromEnum(Feature.fp_armv8)] = .{
 457        .llvm_name = "fp-armv8",
 458        .description = "Enable ARMv8 FP",
 459        .dependencies = featureSet(&[_]Feature{
 460            .fp_armv8d16,
 461            .fp_armv8sp,
 462            .vfp4,
 463        }),
 464    };
 465    result[@intFromEnum(Feature.fp_armv8d16)] = .{
 466        .llvm_name = "fp-armv8d16",
 467        .description = "Enable ARMv8 FP with only 16 d-registers",
 468        .dependencies = featureSet(&[_]Feature{
 469            .fp_armv8d16sp,
 470            .vfp4d16,
 471        }),
 472    };
 473    result[@intFromEnum(Feature.fp_armv8d16sp)] = .{
 474        .llvm_name = "fp-armv8d16sp",
 475        .description = "Enable ARMv8 FP with only 16 d-registers and no double precision",
 476        .dependencies = featureSet(&[_]Feature{
 477            .vfp4d16sp,
 478        }),
 479    };
 480    result[@intFromEnum(Feature.fp_armv8sp)] = .{
 481        .llvm_name = "fp-armv8sp",
 482        .description = "Enable ARMv8 FP with no double precision",
 483        .dependencies = featureSet(&[_]Feature{
 484            .fp_armv8d16sp,
 485            .vfp4sp,
 486        }),
 487    };
 488    result[@intFromEnum(Feature.fpao)] = .{
 489        .llvm_name = "fpao",
 490        .description = "Enable fast computation of positive address offsets",
 491        .dependencies = featureSet(&[_]Feature{}),
 492    };
 493    result[@intFromEnum(Feature.fpregs)] = .{
 494        .llvm_name = "fpregs",
 495        .description = "Enable FP registers",
 496        .dependencies = featureSet(&[_]Feature{}),
 497    };
 498    result[@intFromEnum(Feature.fpregs16)] = .{
 499        .llvm_name = "fpregs16",
 500        .description = "Enable 16-bit FP registers",
 501        .dependencies = featureSet(&[_]Feature{
 502            .fpregs,
 503        }),
 504    };
 505    result[@intFromEnum(Feature.fpregs64)] = .{
 506        .llvm_name = "fpregs64",
 507        .description = "Enable 64-bit FP registers",
 508        .dependencies = featureSet(&[_]Feature{
 509            .fpregs,
 510        }),
 511    };
 512    result[@intFromEnum(Feature.fullfp16)] = .{
 513        .llvm_name = "fullfp16",
 514        .description = "Enable full half-precision floating point",
 515        .dependencies = featureSet(&[_]Feature{
 516            .fp_armv8d16sp,
 517            .fpregs16,
 518        }),
 519    };
 520    result[@intFromEnum(Feature.fuse_aes)] = .{
 521        .llvm_name = "fuse-aes",
 522        .description = "CPU fuses AES crypto operations",
 523        .dependencies = featureSet(&[_]Feature{}),
 524    };
 525    result[@intFromEnum(Feature.fuse_literals)] = .{
 526        .llvm_name = "fuse-literals",
 527        .description = "CPU fuses literal generation operations",
 528        .dependencies = featureSet(&[_]Feature{}),
 529    };
 530    result[@intFromEnum(Feature.harden_sls_blr)] = .{
 531        .llvm_name = "harden-sls-blr",
 532        .description = "Harden against straight line speculation across indirect calls",
 533        .dependencies = featureSet(&[_]Feature{}),
 534    };
 535    result[@intFromEnum(Feature.harden_sls_nocomdat)] = .{
 536        .llvm_name = "harden-sls-nocomdat",
 537        .description = "Generate thunk code for SLS mitigation in the normal text section",
 538        .dependencies = featureSet(&[_]Feature{}),
 539    };
 540    result[@intFromEnum(Feature.harden_sls_retbr)] = .{
 541        .llvm_name = "harden-sls-retbr",
 542        .description = "Harden against straight line speculation across RETurn and BranchRegister instructions",
 543        .dependencies = featureSet(&[_]Feature{}),
 544    };
 545    result[@intFromEnum(Feature.has_v4t)] = .{
 546        .llvm_name = "v4t",
 547        .description = "Support ARM v4T instructions",
 548        .dependencies = featureSet(&[_]Feature{}),
 549    };
 550    result[@intFromEnum(Feature.has_v5t)] = .{
 551        .llvm_name = "v5t",
 552        .description = "Support ARM v5T instructions",
 553        .dependencies = featureSet(&[_]Feature{
 554            .has_v4t,
 555        }),
 556    };
 557    result[@intFromEnum(Feature.has_v5te)] = .{
 558        .llvm_name = "v5te",
 559        .description = "Support ARM v5TE, v5TEj, and v5TExp instructions",
 560        .dependencies = featureSet(&[_]Feature{
 561            .has_v5t,
 562        }),
 563    };
 564    result[@intFromEnum(Feature.has_v6)] = .{
 565        .llvm_name = "v6",
 566        .description = "Support ARM v6 instructions",
 567        .dependencies = featureSet(&[_]Feature{
 568            .has_v5te,
 569        }),
 570    };
 571    result[@intFromEnum(Feature.has_v6k)] = .{
 572        .llvm_name = "v6k",
 573        .description = "Support ARM v6k instructions",
 574        .dependencies = featureSet(&[_]Feature{
 575            .has_v6,
 576        }),
 577    };
 578    result[@intFromEnum(Feature.has_v6m)] = .{
 579        .llvm_name = "v6m",
 580        .description = "Support ARM v6M instructions",
 581        .dependencies = featureSet(&[_]Feature{
 582            .has_v6,
 583        }),
 584    };
 585    result[@intFromEnum(Feature.has_v6t2)] = .{
 586        .llvm_name = "v6t2",
 587        .description = "Support ARM v6t2 instructions",
 588        .dependencies = featureSet(&[_]Feature{
 589            .has_v6k,
 590            .has_v8m,
 591            .thumb2,
 592        }),
 593    };
 594    result[@intFromEnum(Feature.has_v7)] = .{
 595        .llvm_name = "v7",
 596        .description = "Support ARM v7 instructions",
 597        .dependencies = featureSet(&[_]Feature{
 598            .has_v6t2,
 599            .has_v7clrex,
 600        }),
 601    };
 602    result[@intFromEnum(Feature.has_v7clrex)] = .{
 603        .llvm_name = "v7clrex",
 604        .description = "Has v7 clrex instruction",
 605        .dependencies = featureSet(&[_]Feature{}),
 606    };
 607    result[@intFromEnum(Feature.has_v8)] = .{
 608        .llvm_name = "v8",
 609        .description = "Support ARM v8 instructions",
 610        .dependencies = featureSet(&[_]Feature{
 611            .acquire_release,
 612            .has_v7,
 613            .perfmon,
 614        }),
 615    };
 616    result[@intFromEnum(Feature.has_v8_1a)] = .{
 617        .llvm_name = "v8.1a",
 618        .description = "Support ARM v8.1a instructions",
 619        .dependencies = featureSet(&[_]Feature{
 620            .has_v8,
 621        }),
 622    };
 623    result[@intFromEnum(Feature.has_v8_1m_main)] = .{
 624        .llvm_name = "v8.1m.main",
 625        .description = "Support ARM v8-1M Mainline instructions",
 626        .dependencies = featureSet(&[_]Feature{
 627            .has_v8m_main,
 628        }),
 629    };
 630    result[@intFromEnum(Feature.has_v8_2a)] = .{
 631        .llvm_name = "v8.2a",
 632        .description = "Support ARM v8.2a instructions",
 633        .dependencies = featureSet(&[_]Feature{
 634            .has_v8_1a,
 635        }),
 636    };
 637    result[@intFromEnum(Feature.has_v8_3a)] = .{
 638        .llvm_name = "v8.3a",
 639        .description = "Support ARM v8.3a instructions",
 640        .dependencies = featureSet(&[_]Feature{
 641            .has_v8_2a,
 642        }),
 643    };
 644    result[@intFromEnum(Feature.has_v8_4a)] = .{
 645        .llvm_name = "v8.4a",
 646        .description = "Support ARM v8.4a instructions",
 647        .dependencies = featureSet(&[_]Feature{
 648            .dotprod,
 649            .has_v8_3a,
 650        }),
 651    };
 652    result[@intFromEnum(Feature.has_v8_5a)] = .{
 653        .llvm_name = "v8.5a",
 654        .description = "Support ARM v8.5a instructions",
 655        .dependencies = featureSet(&[_]Feature{
 656            .has_v8_4a,
 657            .sb,
 658        }),
 659    };
 660    result[@intFromEnum(Feature.has_v8_6a)] = .{
 661        .llvm_name = "v8.6a",
 662        .description = "Support ARM v8.6a instructions",
 663        .dependencies = featureSet(&[_]Feature{
 664            .bf16,
 665            .has_v8_5a,
 666            .i8mm,
 667        }),
 668    };
 669    result[@intFromEnum(Feature.has_v8_7a)] = .{
 670        .llvm_name = "v8.7a",
 671        .description = "Support ARM v8.7a instructions",
 672        .dependencies = featureSet(&[_]Feature{
 673            .has_v8_6a,
 674        }),
 675    };
 676    result[@intFromEnum(Feature.has_v8_8a)] = .{
 677        .llvm_name = "v8.8a",
 678        .description = "Support ARM v8.8a instructions",
 679        .dependencies = featureSet(&[_]Feature{
 680            .has_v8_7a,
 681        }),
 682    };
 683    result[@intFromEnum(Feature.has_v8_9a)] = .{
 684        .llvm_name = "v8.9a",
 685        .description = "Support ARM v8.9a instructions",
 686        .dependencies = featureSet(&[_]Feature{
 687            .clrbhb,
 688            .has_v8_8a,
 689        }),
 690    };
 691    result[@intFromEnum(Feature.has_v8m)] = .{
 692        .llvm_name = "v8m",
 693        .description = "Support ARM v8M Baseline instructions",
 694        .dependencies = featureSet(&[_]Feature{
 695            .has_v6m,
 696        }),
 697    };
 698    result[@intFromEnum(Feature.has_v8m_main)] = .{
 699        .llvm_name = "v8m.main",
 700        .description = "Support ARM v8M Mainline instructions",
 701        .dependencies = featureSet(&[_]Feature{
 702            .has_v7,
 703        }),
 704    };
 705    result[@intFromEnum(Feature.has_v9_1a)] = .{
 706        .llvm_name = "v9.1a",
 707        .description = "Support ARM v9.1a instructions",
 708        .dependencies = featureSet(&[_]Feature{
 709            .has_v8_6a,
 710            .has_v9a,
 711        }),
 712    };
 713    result[@intFromEnum(Feature.has_v9_2a)] = .{
 714        .llvm_name = "v9.2a",
 715        .description = "Support ARM v9.2a instructions",
 716        .dependencies = featureSet(&[_]Feature{
 717            .has_v8_7a,
 718            .has_v9_1a,
 719        }),
 720    };
 721    result[@intFromEnum(Feature.has_v9_3a)] = .{
 722        .llvm_name = "v9.3a",
 723        .description = "Support ARM v9.3a instructions",
 724        .dependencies = featureSet(&[_]Feature{
 725            .has_v8_8a,
 726            .has_v9_2a,
 727        }),
 728    };
 729    result[@intFromEnum(Feature.has_v9_4a)] = .{
 730        .llvm_name = "v9.4a",
 731        .description = "Support ARM v9.4a instructions",
 732        .dependencies = featureSet(&[_]Feature{
 733            .has_v8_9a,
 734            .has_v9_3a,
 735        }),
 736    };
 737    result[@intFromEnum(Feature.has_v9_5a)] = .{
 738        .llvm_name = "v9.5a",
 739        .description = "Support ARM v9.5a instructions",
 740        .dependencies = featureSet(&[_]Feature{
 741            .has_v9_4a,
 742        }),
 743    };
 744    result[@intFromEnum(Feature.has_v9_6a)] = .{
 745        .llvm_name = "v9.6a",
 746        .description = "Support ARM v9.6a instructions",
 747        .dependencies = featureSet(&[_]Feature{
 748            .has_v9_5a,
 749        }),
 750    };
 751    result[@intFromEnum(Feature.has_v9a)] = .{
 752        .llvm_name = "v9a",
 753        .description = "Support ARM v9a instructions",
 754        .dependencies = featureSet(&[_]Feature{
 755            .has_v8_5a,
 756        }),
 757    };
 758    result[@intFromEnum(Feature.hwdiv)] = .{
 759        .llvm_name = "hwdiv",
 760        .description = "Enable divide instructions in Thumb",
 761        .dependencies = featureSet(&[_]Feature{}),
 762    };
 763    result[@intFromEnum(Feature.hwdiv_arm)] = .{
 764        .llvm_name = "hwdiv-arm",
 765        .description = "Enable divide instructions in ARM mode",
 766        .dependencies = featureSet(&[_]Feature{}),
 767    };
 768    result[@intFromEnum(Feature.i8mm)] = .{
 769        .llvm_name = "i8mm",
 770        .description = "Enable Matrix Multiply Int8 Extension",
 771        .dependencies = featureSet(&[_]Feature{
 772            .neon,
 773        }),
 774    };
 775    result[@intFromEnum(Feature.iwmmxt)] = .{
 776        .llvm_name = "iwmmxt",
 777        .description = "ARMv5te architecture",
 778        .dependencies = featureSet(&[_]Feature{
 779            .v5te,
 780        }),
 781    };
 782    result[@intFromEnum(Feature.iwmmxt2)] = .{
 783        .llvm_name = "iwmmxt2",
 784        .description = "ARMv5te architecture",
 785        .dependencies = featureSet(&[_]Feature{
 786            .v5te,
 787        }),
 788    };
 789    result[@intFromEnum(Feature.lob)] = .{
 790        .llvm_name = "lob",
 791        .description = "Enable Low Overhead Branch extensions",
 792        .dependencies = featureSet(&[_]Feature{}),
 793    };
 794    result[@intFromEnum(Feature.long_calls)] = .{
 795        .llvm_name = "long-calls",
 796        .description = "Generate calls via indirect call instructions",
 797        .dependencies = featureSet(&[_]Feature{}),
 798    };
 799    result[@intFromEnum(Feature.loop_align)] = .{
 800        .llvm_name = "loop-align",
 801        .description = "Prefer 32-bit alignment for branch targets",
 802        .dependencies = featureSet(&[_]Feature{}),
 803    };
 804    result[@intFromEnum(Feature.m55)] = .{
 805        .llvm_name = "m55",
 806        .description = "Cortex-M55 ARM processors",
 807        .dependencies = featureSet(&[_]Feature{}),
 808    };
 809    result[@intFromEnum(Feature.m85)] = .{
 810        .llvm_name = "m85",
 811        .description = "Cortex-M85 ARM processors",
 812        .dependencies = featureSet(&[_]Feature{}),
 813    };
 814    result[@intFromEnum(Feature.mclass)] = .{
 815        .llvm_name = "mclass",
 816        .description = "Is microcontroller profile ('M' series)",
 817        .dependencies = featureSet(&[_]Feature{}),
 818    };
 819    result[@intFromEnum(Feature.mp)] = .{
 820        .llvm_name = "mp",
 821        .description = "Supports Multiprocessing extension",
 822        .dependencies = featureSet(&[_]Feature{}),
 823    };
 824    result[@intFromEnum(Feature.muxed_units)] = .{
 825        .llvm_name = "muxed-units",
 826        .description = "Has muxed AGU and NEON/FPU",
 827        .dependencies = featureSet(&[_]Feature{}),
 828    };
 829    result[@intFromEnum(Feature.mve)] = .{
 830        .llvm_name = "mve",
 831        .description = "Support M-Class Vector Extension with integer ops",
 832        .dependencies = featureSet(&[_]Feature{
 833            .dsp,
 834            .fpregs16,
 835            .fpregs64,
 836            .has_v8_1m_main,
 837        }),
 838    };
 839    result[@intFromEnum(Feature.mve1beat)] = .{
 840        .llvm_name = "mve1beat",
 841        .description = "Model MVE instructions as a 1 beat per tick architecture",
 842        .dependencies = featureSet(&[_]Feature{}),
 843    };
 844    result[@intFromEnum(Feature.mve2beat)] = .{
 845        .llvm_name = "mve2beat",
 846        .description = "Model MVE instructions as a 2 beats per tick architecture",
 847        .dependencies = featureSet(&[_]Feature{}),
 848    };
 849    result[@intFromEnum(Feature.mve4beat)] = .{
 850        .llvm_name = "mve4beat",
 851        .description = "Model MVE instructions as a 4 beats per tick architecture",
 852        .dependencies = featureSet(&[_]Feature{}),
 853    };
 854    result[@intFromEnum(Feature.mve_fp)] = .{
 855        .llvm_name = "mve.fp",
 856        .description = "Support M-Class Vector Extension with integer and floating ops",
 857        .dependencies = featureSet(&[_]Feature{
 858            .fullfp16,
 859            .mve,
 860        }),
 861    };
 862    result[@intFromEnum(Feature.nacl_trap)] = .{
 863        .llvm_name = "nacl-trap",
 864        .description = "NaCl trap",
 865        .dependencies = featureSet(&[_]Feature{}),
 866    };
 867    result[@intFromEnum(Feature.neon)] = .{
 868        .llvm_name = "neon",
 869        .description = "Enable NEON instructions",
 870        .dependencies = featureSet(&[_]Feature{
 871            .vfp3,
 872        }),
 873    };
 874    result[@intFromEnum(Feature.neon_fpmovs)] = .{
 875        .llvm_name = "neon-fpmovs",
 876        .description = "Convert VMOVSR, VMOVRS, VMOVS to NEON",
 877        .dependencies = featureSet(&[_]Feature{}),
 878    };
 879    result[@intFromEnum(Feature.neonfp)] = .{
 880        .llvm_name = "neonfp",
 881        .description = "Use NEON for single precision FP",
 882        .dependencies = featureSet(&[_]Feature{}),
 883    };
 884    result[@intFromEnum(Feature.no_branch_predictor)] = .{
 885        .llvm_name = "no-branch-predictor",
 886        .description = "Has no branch predictor",
 887        .dependencies = featureSet(&[_]Feature{}),
 888    };
 889    result[@intFromEnum(Feature.no_bti_at_return_twice)] = .{
 890        .llvm_name = "no-bti-at-return-twice",
 891        .description = "Don't place a BTI instruction after a return-twice",
 892        .dependencies = featureSet(&[_]Feature{}),
 893    };
 894    result[@intFromEnum(Feature.no_movt)] = .{
 895        .llvm_name = "no-movt",
 896        .description = "Don't use movt/movw pairs for 32-bit imms",
 897        .dependencies = featureSet(&[_]Feature{}),
 898    };
 899    result[@intFromEnum(Feature.no_neg_immediates)] = .{
 900        .llvm_name = "no-neg-immediates",
 901        .description = "Convert immediates and instructions to their negated or complemented equivalent when the immediate does not fit in the encoding.",
 902        .dependencies = featureSet(&[_]Feature{}),
 903    };
 904    result[@intFromEnum(Feature.noarm)] = .{
 905        .llvm_name = "noarm",
 906        .description = "Does not support ARM mode execution",
 907        .dependencies = featureSet(&[_]Feature{}),
 908    };
 909    result[@intFromEnum(Feature.nonpipelined_vfp)] = .{
 910        .llvm_name = "nonpipelined-vfp",
 911        .description = "VFP instructions are not pipelined",
 912        .dependencies = featureSet(&[_]Feature{}),
 913    };
 914    result[@intFromEnum(Feature.pacbti)] = .{
 915        .llvm_name = "pacbti",
 916        .description = "Enable Pointer Authentication and Branch Target Identification",
 917        .dependencies = featureSet(&[_]Feature{}),
 918    };
 919    result[@intFromEnum(Feature.perfmon)] = .{
 920        .llvm_name = "perfmon",
 921        .description = "Enable support for Performance Monitor extensions",
 922        .dependencies = featureSet(&[_]Feature{}),
 923    };
 924    result[@intFromEnum(Feature.prefer_ishst)] = .{
 925        .llvm_name = "prefer-ishst",
 926        .description = "Prefer ISHST barriers",
 927        .dependencies = featureSet(&[_]Feature{}),
 928    };
 929    result[@intFromEnum(Feature.prefer_vmovsr)] = .{
 930        .llvm_name = "prefer-vmovsr",
 931        .description = "Prefer VMOVSR",
 932        .dependencies = featureSet(&[_]Feature{}),
 933    };
 934    result[@intFromEnum(Feature.prof_unpr)] = .{
 935        .llvm_name = "prof-unpr",
 936        .description = "Is profitable to unpredicate",
 937        .dependencies = featureSet(&[_]Feature{}),
 938    };
 939    result[@intFromEnum(Feature.ras)] = .{
 940        .llvm_name = "ras",
 941        .description = "Enable Reliability, Availability and Serviceability extensions",
 942        .dependencies = featureSet(&[_]Feature{}),
 943    };
 944    result[@intFromEnum(Feature.rclass)] = .{
 945        .llvm_name = "rclass",
 946        .description = "Is realtime profile ('R' series)",
 947        .dependencies = featureSet(&[_]Feature{}),
 948    };
 949    result[@intFromEnum(Feature.read_tp_tpidrprw)] = .{
 950        .llvm_name = "read-tp-tpidrprw",
 951        .description = "Reading thread pointer from TPIDRPRW register",
 952        .dependencies = featureSet(&[_]Feature{}),
 953    };
 954    result[@intFromEnum(Feature.read_tp_tpidruro)] = .{
 955        .llvm_name = "read-tp-tpidruro",
 956        .description = "Reading thread pointer from TPIDRURO register",
 957        .dependencies = featureSet(&[_]Feature{}),
 958    };
 959    result[@intFromEnum(Feature.read_tp_tpidrurw)] = .{
 960        .llvm_name = "read-tp-tpidrurw",
 961        .description = "Reading thread pointer from TPIDRURW register",
 962        .dependencies = featureSet(&[_]Feature{}),
 963    };
 964    result[@intFromEnum(Feature.reserve_r9)] = .{
 965        .llvm_name = "reserve-r9",
 966        .description = "Reserve R9, making it unavailable as GPR",
 967        .dependencies = featureSet(&[_]Feature{}),
 968    };
 969    result[@intFromEnum(Feature.ret_addr_stack)] = .{
 970        .llvm_name = "ret-addr-stack",
 971        .description = "Has return address stack",
 972        .dependencies = featureSet(&[_]Feature{}),
 973    };
 974    result[@intFromEnum(Feature.sb)] = .{
 975        .llvm_name = "sb",
 976        .description = "Enable v8.5a Speculation Barrier",
 977        .dependencies = featureSet(&[_]Feature{}),
 978    };
 979    result[@intFromEnum(Feature.sha2)] = .{
 980        .llvm_name = "sha2",
 981        .description = "Enable SHA1 and SHA256 support",
 982        .dependencies = featureSet(&[_]Feature{
 983            .neon,
 984        }),
 985    };
 986    result[@intFromEnum(Feature.slow_fp_brcc)] = .{
 987        .llvm_name = "slow-fp-brcc",
 988        .description = "FP compare + branch is slow",
 989        .dependencies = featureSet(&[_]Feature{}),
 990    };
 991    result[@intFromEnum(Feature.slow_load_D_subreg)] = .{
 992        .llvm_name = "slow-load-D-subreg",
 993        .description = "Loading into D subregs is slow",
 994        .dependencies = featureSet(&[_]Feature{}),
 995    };
 996    result[@intFromEnum(Feature.slow_odd_reg)] = .{
 997        .llvm_name = "slow-odd-reg",
 998        .description = "VLDM/VSTM starting with an odd register is slow",
 999        .dependencies = featureSet(&[_]Feature{}),
1000    };
1001    result[@intFromEnum(Feature.slow_vdup32)] = .{
1002        .llvm_name = "slow-vdup32",
1003        .description = "Has slow VDUP32 - prefer VMOV",
1004        .dependencies = featureSet(&[_]Feature{}),
1005    };
1006    result[@intFromEnum(Feature.slow_vgetlni32)] = .{
1007        .llvm_name = "slow-vgetlni32",
1008        .description = "Has slow VGETLNi32 - prefer VMOV",
1009        .dependencies = featureSet(&[_]Feature{}),
1010    };
1011    result[@intFromEnum(Feature.slowfpvfmx)] = .{
1012        .llvm_name = "slowfpvfmx",
1013        .description = "Disable VFP / NEON FMA instructions",
1014        .dependencies = featureSet(&[_]Feature{}),
1015    };
1016    result[@intFromEnum(Feature.slowfpvmlx)] = .{
1017        .llvm_name = "slowfpvmlx",
1018        .description = "Disable VFP / NEON MAC instructions",
1019        .dependencies = featureSet(&[_]Feature{}),
1020    };
1021    result[@intFromEnum(Feature.soft_float)] = .{
1022        .llvm_name = "soft-float",
1023        .description = "Use software floating point features.",
1024        .dependencies = featureSet(&[_]Feature{}),
1025    };
1026    result[@intFromEnum(Feature.splat_vfp_neon)] = .{
1027        .llvm_name = "splat-vfp-neon",
1028        .description = "Splat register from VFP to NEON",
1029        .dependencies = featureSet(&[_]Feature{
1030            .dont_widen_vmovs,
1031        }),
1032    };
1033    result[@intFromEnum(Feature.strict_align)] = .{
1034        .llvm_name = "strict-align",
1035        .description = "Disallow all unaligned memory access",
1036        .dependencies = featureSet(&[_]Feature{}),
1037    };
1038    result[@intFromEnum(Feature.thumb2)] = .{
1039        .llvm_name = "thumb2",
1040        .description = "Enable Thumb2 instructions",
1041        .dependencies = featureSet(&[_]Feature{}),
1042    };
1043    result[@intFromEnum(Feature.thumb_mode)] = .{
1044        .llvm_name = "thumb-mode",
1045        .description = "Thumb mode",
1046        .dependencies = featureSet(&[_]Feature{}),
1047    };
1048    result[@intFromEnum(Feature.trustzone)] = .{
1049        .llvm_name = "trustzone",
1050        .description = "Enable support for TrustZone security extensions",
1051        .dependencies = featureSet(&[_]Feature{}),
1052    };
1053    result[@intFromEnum(Feature.use_mipipeliner)] = .{
1054        .llvm_name = "use-mipipeliner",
1055        .description = "Use the MachinePipeliner",
1056        .dependencies = featureSet(&[_]Feature{}),
1057    };
1058    result[@intFromEnum(Feature.use_misched)] = .{
1059        .llvm_name = "use-misched",
1060        .description = "Use the MachineScheduler",
1061        .dependencies = featureSet(&[_]Feature{}),
1062    };
1063    result[@intFromEnum(Feature.v2)] = .{
1064        .llvm_name = null,
1065        .description = "ARMv2 architecture",
1066        .dependencies = featureSet(&[_]Feature{
1067            .strict_align,
1068        }),
1069    };
1070    result[@intFromEnum(Feature.v2a)] = .{
1071        .llvm_name = null,
1072        .description = "ARMv2a architecture",
1073        .dependencies = featureSet(&[_]Feature{
1074            .strict_align,
1075        }),
1076    };
1077    result[@intFromEnum(Feature.v3)] = .{
1078        .llvm_name = null,
1079        .description = "ARMv3 architecture",
1080        .dependencies = featureSet(&[_]Feature{
1081            .strict_align,
1082        }),
1083    };
1084    result[@intFromEnum(Feature.v3m)] = .{
1085        .llvm_name = null,
1086        .description = "ARMv3m architecture",
1087        .dependencies = featureSet(&[_]Feature{
1088            .strict_align,
1089        }),
1090    };
1091    result[@intFromEnum(Feature.v4)] = .{
1092        .llvm_name = "armv4",
1093        .description = "ARMv4 architecture",
1094        .dependencies = featureSet(&[_]Feature{
1095            .strict_align,
1096        }),
1097    };
1098    result[@intFromEnum(Feature.v4t)] = .{
1099        .llvm_name = "armv4t",
1100        .description = "ARMv4t architecture",
1101        .dependencies = featureSet(&[_]Feature{
1102            .has_v4t,
1103            .strict_align,
1104        }),
1105    };
1106    result[@intFromEnum(Feature.v5t)] = .{
1107        .llvm_name = "armv5t",
1108        .description = "ARMv5t architecture",
1109        .dependencies = featureSet(&[_]Feature{
1110            .has_v5t,
1111            .strict_align,
1112        }),
1113    };
1114    result[@intFromEnum(Feature.v5te)] = .{
1115        .llvm_name = "armv5te",
1116        .description = "ARMv5te architecture",
1117        .dependencies = featureSet(&[_]Feature{
1118            .has_v5te,
1119            .strict_align,
1120        }),
1121    };
1122    result[@intFromEnum(Feature.v5tej)] = .{
1123        .llvm_name = "armv5tej",
1124        .description = "ARMv5tej architecture",
1125        .dependencies = featureSet(&[_]Feature{
1126            .has_v5te,
1127            .strict_align,
1128        }),
1129    };
1130    result[@intFromEnum(Feature.v6)] = .{
1131        .llvm_name = "armv6",
1132        .description = "ARMv6 architecture",
1133        .dependencies = featureSet(&[_]Feature{
1134            .dsp,
1135            .has_v6,
1136        }),
1137    };
1138    result[@intFromEnum(Feature.v6j)] = .{
1139        .llvm_name = "armv6j",
1140        .description = "ARMv7a architecture",
1141        .dependencies = featureSet(&[_]Feature{
1142            .v6,
1143        }),
1144    };
1145    result[@intFromEnum(Feature.v6k)] = .{
1146        .llvm_name = "armv6k",
1147        .description = "ARMv6k architecture",
1148        .dependencies = featureSet(&[_]Feature{
1149            .has_v6k,
1150        }),
1151    };
1152    result[@intFromEnum(Feature.v6kz)] = .{
1153        .llvm_name = "armv6kz",
1154        .description = "ARMv6kz architecture",
1155        .dependencies = featureSet(&[_]Feature{
1156            .has_v6k,
1157            .trustzone,
1158        }),
1159    };
1160    result[@intFromEnum(Feature.v6m)] = .{
1161        .llvm_name = "armv6-m",
1162        .description = "ARMv6m architecture",
1163        .dependencies = featureSet(&[_]Feature{
1164            .db,
1165            .has_v6m,
1166            .mclass,
1167            .noarm,
1168            .strict_align,
1169            .thumb_mode,
1170        }),
1171    };
1172    result[@intFromEnum(Feature.v6sm)] = .{
1173        .llvm_name = "armv6s-m",
1174        .description = "ARMv6sm architecture",
1175        .dependencies = featureSet(&[_]Feature{
1176            .db,
1177            .has_v6m,
1178            .mclass,
1179            .noarm,
1180            .strict_align,
1181            .thumb_mode,
1182        }),
1183    };
1184    result[@intFromEnum(Feature.v6t2)] = .{
1185        .llvm_name = "armv6t2",
1186        .description = "ARMv6t2 architecture",
1187        .dependencies = featureSet(&[_]Feature{
1188            .dsp,
1189            .has_v6t2,
1190        }),
1191    };
1192    result[@intFromEnum(Feature.v7a)] = .{
1193        .llvm_name = "armv7-a",
1194        .description = "ARMv7a architecture",
1195        .dependencies = featureSet(&[_]Feature{
1196            .aclass,
1197            .db,
1198            .dsp,
1199            .has_v7,
1200            .neon,
1201            .perfmon,
1202        }),
1203    };
1204    result[@intFromEnum(Feature.v7em)] = .{
1205        .llvm_name = "armv7e-m",
1206        .description = "ARMv7em architecture",
1207        .dependencies = featureSet(&[_]Feature{
1208            .db,
1209            .dsp,
1210            .has_v7,
1211            .hwdiv,
1212            .mclass,
1213            .noarm,
1214            .thumb_mode,
1215        }),
1216    };
1217    result[@intFromEnum(Feature.v7m)] = .{
1218        .llvm_name = "armv7-m",
1219        .description = "ARMv7m architecture",
1220        .dependencies = featureSet(&[_]Feature{
1221            .db,
1222            .has_v7,
1223            .hwdiv,
1224            .mclass,
1225            .noarm,
1226            .thumb_mode,
1227        }),
1228    };
1229    result[@intFromEnum(Feature.v7r)] = .{
1230        .llvm_name = "armv7-r",
1231        .description = "ARMv7r architecture",
1232        .dependencies = featureSet(&[_]Feature{
1233            .db,
1234            .dsp,
1235            .has_v7,
1236            .hwdiv,
1237            .perfmon,
1238            .rclass,
1239        }),
1240    };
1241    result[@intFromEnum(Feature.v7ve)] = .{
1242        .llvm_name = "armv7ve",
1243        .description = "ARMv7ve architecture",
1244        .dependencies = featureSet(&[_]Feature{
1245            .aclass,
1246            .db,
1247            .dsp,
1248            .has_v7,
1249            .mp,
1250            .neon,
1251            .perfmon,
1252            .trustzone,
1253            .virtualization,
1254        }),
1255    };
1256    result[@intFromEnum(Feature.v8_1a)] = .{
1257        .llvm_name = "armv8.1-a",
1258        .description = "ARMv81a architecture",
1259        .dependencies = featureSet(&[_]Feature{
1260            .aclass,
1261            .crc,
1262            .crypto,
1263            .db,
1264            .dsp,
1265            .fp_armv8,
1266            .has_v8_1a,
1267            .mp,
1268            .trustzone,
1269            .virtualization,
1270        }),
1271    };
1272    result[@intFromEnum(Feature.v8_1m_main)] = .{
1273        .llvm_name = "armv8.1-m.main",
1274        .description = "ARMv81mMainline architecture",
1275        .dependencies = featureSet(&[_]Feature{
1276            .@"8msecext",
1277            .acquire_release,
1278            .db,
1279            .has_v8_1m_main,
1280            .hwdiv,
1281            .lob,
1282            .mclass,
1283            .noarm,
1284            .ras,
1285            .thumb_mode,
1286        }),
1287    };
1288    result[@intFromEnum(Feature.v8_2a)] = .{
1289        .llvm_name = "armv8.2-a",
1290        .description = "ARMv82a architecture",
1291        .dependencies = featureSet(&[_]Feature{
1292            .aclass,
1293            .crc,
1294            .crypto,
1295            .db,
1296            .dsp,
1297            .fp_armv8,
1298            .has_v8_2a,
1299            .mp,
1300            .ras,
1301            .trustzone,
1302            .virtualization,
1303        }),
1304    };
1305    result[@intFromEnum(Feature.v8_3a)] = .{
1306        .llvm_name = "armv8.3-a",
1307        .description = "ARMv83a architecture",
1308        .dependencies = featureSet(&[_]Feature{
1309            .aclass,
1310            .crc,
1311            .crypto,
1312            .db,
1313            .dsp,
1314            .fp_armv8,
1315            .has_v8_3a,
1316            .mp,
1317            .ras,
1318            .trustzone,
1319            .virtualization,
1320        }),
1321    };
1322    result[@intFromEnum(Feature.v8_4a)] = .{
1323        .llvm_name = "armv8.4-a",
1324        .description = "ARMv84a architecture",
1325        .dependencies = featureSet(&[_]Feature{
1326            .aclass,
1327            .crc,
1328            .crypto,
1329            .db,
1330            .dsp,
1331            .fp_armv8,
1332            .has_v8_4a,
1333            .mp,
1334            .ras,
1335            .trustzone,
1336            .virtualization,
1337        }),
1338    };
1339    result[@intFromEnum(Feature.v8_5a)] = .{
1340        .llvm_name = "armv8.5-a",
1341        .description = "ARMv85a architecture",
1342        .dependencies = featureSet(&[_]Feature{
1343            .aclass,
1344            .crc,
1345            .crypto,
1346            .db,
1347            .dsp,
1348            .fp_armv8,
1349            .has_v8_5a,
1350            .mp,
1351            .ras,
1352            .trustzone,
1353            .virtualization,
1354        }),
1355    };
1356    result[@intFromEnum(Feature.v8_6a)] = .{
1357        .llvm_name = "armv8.6-a",
1358        .description = "ARMv86a architecture",
1359        .dependencies = featureSet(&[_]Feature{
1360            .aclass,
1361            .crc,
1362            .crypto,
1363            .db,
1364            .dsp,
1365            .fp_armv8,
1366            .has_v8_6a,
1367            .mp,
1368            .ras,
1369            .trustzone,
1370            .virtualization,
1371        }),
1372    };
1373    result[@intFromEnum(Feature.v8_7a)] = .{
1374        .llvm_name = "armv8.7-a",
1375        .description = "ARMv87a architecture",
1376        .dependencies = featureSet(&[_]Feature{
1377            .aclass,
1378            .crc,
1379            .crypto,
1380            .db,
1381            .dsp,
1382            .fp_armv8,
1383            .has_v8_7a,
1384            .mp,
1385            .ras,
1386            .trustzone,
1387            .virtualization,
1388        }),
1389    };
1390    result[@intFromEnum(Feature.v8_8a)] = .{
1391        .llvm_name = "armv8.8-a",
1392        .description = "ARMv88a architecture",
1393        .dependencies = featureSet(&[_]Feature{
1394            .aclass,
1395            .crc,
1396            .crypto,
1397            .db,
1398            .dsp,
1399            .fp_armv8,
1400            .has_v8_8a,
1401            .mp,
1402            .ras,
1403            .trustzone,
1404            .virtualization,
1405        }),
1406    };
1407    result[@intFromEnum(Feature.v8_9a)] = .{
1408        .llvm_name = "armv8.9-a",
1409        .description = "ARMv89a architecture",
1410        .dependencies = featureSet(&[_]Feature{
1411            .aclass,
1412            .crc,
1413            .crypto,
1414            .db,
1415            .dsp,
1416            .fp_armv8,
1417            .has_v8_9a,
1418            .mp,
1419            .ras,
1420            .trustzone,
1421            .virtualization,
1422        }),
1423    };
1424    result[@intFromEnum(Feature.v8a)] = .{
1425        .llvm_name = "armv8-a",
1426        .description = "ARMv8a architecture",
1427        .dependencies = featureSet(&[_]Feature{
1428            .aclass,
1429            .crc,
1430            .crypto,
1431            .db,
1432            .dsp,
1433            .fp_armv8,
1434            .has_v8,
1435            .mp,
1436            .trustzone,
1437            .virtualization,
1438        }),
1439    };
1440    result[@intFromEnum(Feature.v8m)] = .{
1441        .llvm_name = "armv8-m.base",
1442        .description = "ARMv8mBaseline architecture",
1443        .dependencies = featureSet(&[_]Feature{
1444            .@"8msecext",
1445            .acquire_release,
1446            .db,
1447            .has_v7clrex,
1448            .has_v8m,
1449            .hwdiv,
1450            .mclass,
1451            .noarm,
1452            .strict_align,
1453            .thumb_mode,
1454        }),
1455    };
1456    result[@intFromEnum(Feature.v8m_main)] = .{
1457        .llvm_name = "armv8-m.main",
1458        .description = "ARMv8mMainline architecture",
1459        .dependencies = featureSet(&[_]Feature{
1460            .@"8msecext",
1461            .acquire_release,
1462            .db,
1463            .has_v8m_main,
1464            .hwdiv,
1465            .mclass,
1466            .noarm,
1467            .thumb_mode,
1468        }),
1469    };
1470    result[@intFromEnum(Feature.v8r)] = .{
1471        .llvm_name = "armv8-r",
1472        .description = "ARMv8r architecture",
1473        .dependencies = featureSet(&[_]Feature{
1474            .crc,
1475            .db,
1476            .dfb,
1477            .dsp,
1478            .fp_armv8d16sp,
1479            .has_v8,
1480            .mp,
1481            .rclass,
1482            .virtualization,
1483        }),
1484    };
1485    result[@intFromEnum(Feature.v9_1a)] = .{
1486        .llvm_name = "armv9.1-a",
1487        .description = "ARMv91a architecture",
1488        .dependencies = featureSet(&[_]Feature{
1489            .aclass,
1490            .crc,
1491            .db,
1492            .dsp,
1493            .fp_armv8,
1494            .has_v9_1a,
1495            .mp,
1496            .ras,
1497            .trustzone,
1498            .virtualization,
1499        }),
1500    };
1501    result[@intFromEnum(Feature.v9_2a)] = .{
1502        .llvm_name = "armv9.2-a",
1503        .description = "ARMv92a architecture",
1504        .dependencies = featureSet(&[_]Feature{
1505            .aclass,
1506            .crc,
1507            .db,
1508            .dsp,
1509            .fp_armv8,
1510            .has_v9_2a,
1511            .mp,
1512            .ras,
1513            .trustzone,
1514            .virtualization,
1515        }),
1516    };
1517    result[@intFromEnum(Feature.v9_3a)] = .{
1518        .llvm_name = "armv9.3-a",
1519        .description = "ARMv93a architecture",
1520        .dependencies = featureSet(&[_]Feature{
1521            .aclass,
1522            .crc,
1523            .crypto,
1524            .db,
1525            .dsp,
1526            .fp_armv8,
1527            .has_v9_3a,
1528            .mp,
1529            .ras,
1530            .trustzone,
1531            .virtualization,
1532        }),
1533    };
1534    result[@intFromEnum(Feature.v9_4a)] = .{
1535        .llvm_name = "armv9.4-a",
1536        .description = "ARMv94a architecture",
1537        .dependencies = featureSet(&[_]Feature{
1538            .aclass,
1539            .crc,
1540            .db,
1541            .dsp,
1542            .fp_armv8,
1543            .has_v9_4a,
1544            .mp,
1545            .ras,
1546            .trustzone,
1547            .virtualization,
1548        }),
1549    };
1550    result[@intFromEnum(Feature.v9_5a)] = .{
1551        .llvm_name = "armv9.5-a",
1552        .description = "ARMv95a architecture",
1553        .dependencies = featureSet(&[_]Feature{
1554            .aclass,
1555            .crc,
1556            .db,
1557            .dsp,
1558            .fp_armv8,
1559            .has_v9_5a,
1560            .mp,
1561            .ras,
1562            .trustzone,
1563            .virtualization,
1564        }),
1565    };
1566    result[@intFromEnum(Feature.v9_6a)] = .{
1567        .llvm_name = "armv9.6-a",
1568        .description = "ARMv96a architecture",
1569        .dependencies = featureSet(&[_]Feature{
1570            .aclass,
1571            .crc,
1572            .db,
1573            .dsp,
1574            .fp_armv8,
1575            .has_v9_6a,
1576            .mp,
1577            .ras,
1578            .trustzone,
1579            .virtualization,
1580        }),
1581    };
1582    result[@intFromEnum(Feature.v9a)] = .{
1583        .llvm_name = "armv9-a",
1584        .description = "ARMv9a architecture",
1585        .dependencies = featureSet(&[_]Feature{
1586            .aclass,
1587            .crc,
1588            .db,
1589            .dsp,
1590            .fp_armv8,
1591            .has_v9a,
1592            .mp,
1593            .ras,
1594            .trustzone,
1595            .virtualization,
1596        }),
1597    };
1598    result[@intFromEnum(Feature.vfp2)] = .{
1599        .llvm_name = "vfp2",
1600        .description = "Enable VFP2 instructions",
1601        .dependencies = featureSet(&[_]Feature{
1602            .fp64,
1603            .vfp2sp,
1604        }),
1605    };
1606    result[@intFromEnum(Feature.vfp2sp)] = .{
1607        .llvm_name = "vfp2sp",
1608        .description = "Enable VFP2 instructions with no double precision",
1609        .dependencies = featureSet(&[_]Feature{
1610            .fpregs,
1611        }),
1612    };
1613    result[@intFromEnum(Feature.vfp3)] = .{
1614        .llvm_name = "vfp3",
1615        .description = "Enable VFP3 instructions",
1616        .dependencies = featureSet(&[_]Feature{
1617            .vfp3d16,
1618            .vfp3sp,
1619        }),
1620    };
1621    result[@intFromEnum(Feature.vfp3d16)] = .{
1622        .llvm_name = "vfp3d16",
1623        .description = "Enable VFP3 instructions with only 16 d-registers",
1624        .dependencies = featureSet(&[_]Feature{
1625            .vfp2,
1626            .vfp3d16sp,
1627        }),
1628    };
1629    result[@intFromEnum(Feature.vfp3d16sp)] = .{
1630        .llvm_name = "vfp3d16sp",
1631        .description = "Enable VFP3 instructions with only 16 d-registers and no double precision",
1632        .dependencies = featureSet(&[_]Feature{
1633            .vfp2sp,
1634        }),
1635    };
1636    result[@intFromEnum(Feature.vfp3sp)] = .{
1637        .llvm_name = "vfp3sp",
1638        .description = "Enable VFP3 instructions with no double precision",
1639        .dependencies = featureSet(&[_]Feature{
1640            .d32,
1641            .vfp3d16sp,
1642        }),
1643    };
1644    result[@intFromEnum(Feature.vfp4)] = .{
1645        .llvm_name = "vfp4",
1646        .description = "Enable VFP4 instructions",
1647        .dependencies = featureSet(&[_]Feature{
1648            .vfp3,
1649            .vfp4d16,
1650            .vfp4sp,
1651        }),
1652    };
1653    result[@intFromEnum(Feature.vfp4d16)] = .{
1654        .llvm_name = "vfp4d16",
1655        .description = "Enable VFP4 instructions with only 16 d-registers",
1656        .dependencies = featureSet(&[_]Feature{
1657            .vfp3d16,
1658            .vfp4d16sp,
1659        }),
1660    };
1661    result[@intFromEnum(Feature.vfp4d16sp)] = .{
1662        .llvm_name = "vfp4d16sp",
1663        .description = "Enable VFP4 instructions with only 16 d-registers and no double precision",
1664        .dependencies = featureSet(&[_]Feature{
1665            .fp16,
1666            .vfp3d16sp,
1667        }),
1668    };
1669    result[@intFromEnum(Feature.vfp4sp)] = .{
1670        .llvm_name = "vfp4sp",
1671        .description = "Enable VFP4 instructions with no double precision",
1672        .dependencies = featureSet(&[_]Feature{
1673            .vfp3sp,
1674            .vfp4d16sp,
1675        }),
1676    };
1677    result[@intFromEnum(Feature.virtualization)] = .{
1678        .llvm_name = "virtualization",
1679        .description = "Supports Virtualization extension",
1680        .dependencies = featureSet(&[_]Feature{
1681            .hwdiv,
1682            .hwdiv_arm,
1683        }),
1684    };
1685    result[@intFromEnum(Feature.vldn_align)] = .{
1686        .llvm_name = "vldn-align",
1687        .description = "Check for VLDn unaligned access",
1688        .dependencies = featureSet(&[_]Feature{}),
1689    };
1690    result[@intFromEnum(Feature.vmlx_forwarding)] = .{
1691        .llvm_name = "vmlx-forwarding",
1692        .description = "Has multiplier accumulator forwarding",
1693        .dependencies = featureSet(&[_]Feature{}),
1694    };
1695    result[@intFromEnum(Feature.vmlx_hazards)] = .{
1696        .llvm_name = "vmlx-hazards",
1697        .description = "Has VMLx hazards",
1698        .dependencies = featureSet(&[_]Feature{}),
1699    };
1700    result[@intFromEnum(Feature.wide_stride_vfp)] = .{
1701        .llvm_name = "wide-stride-vfp",
1702        .description = "Use a wide stride when allocating VFP registers",
1703        .dependencies = featureSet(&[_]Feature{}),
1704    };
1705    result[@intFromEnum(Feature.xscale)] = .{
1706        .llvm_name = "xscale",
1707        .description = "ARMv5te architecture",
1708        .dependencies = featureSet(&[_]Feature{
1709            .v5te,
1710        }),
1711    };
1712    result[@intFromEnum(Feature.zcz)] = .{
1713        .llvm_name = "zcz",
1714        .description = "Has zero-cycle zeroing instructions",
1715        .dependencies = featureSet(&[_]Feature{}),
1716    };
1717    const ti = @typeInfo(Feature);
1718    for (&result, 0..) |*elem, i| {
1719        elem.index = i;
1720        elem.name = ti.@"enum".fields[i].name;
1721    }
1722    break :blk result;
1723};
1724
1725pub const cpu = struct {
1726    pub const arm1020e: CpuModel = .{
1727        .name = "arm1020e",
1728        .llvm_name = "arm1020e",
1729        .features = featureSet(&[_]Feature{
1730            .v5te,
1731        }),
1732    };
1733    pub const arm1020t: CpuModel = .{
1734        .name = "arm1020t",
1735        .llvm_name = "arm1020t",
1736        .features = featureSet(&[_]Feature{
1737            .v5t,
1738        }),
1739    };
1740    pub const arm1022e: CpuModel = .{
1741        .name = "arm1022e",
1742        .llvm_name = "arm1022e",
1743        .features = featureSet(&[_]Feature{
1744            .v5te,
1745        }),
1746    };
1747    pub const arm10e: CpuModel = .{
1748        .name = "arm10e",
1749        .llvm_name = "arm10e",
1750        .features = featureSet(&[_]Feature{
1751            .v5te,
1752        }),
1753    };
1754    pub const arm10tdmi: CpuModel = .{
1755        .name = "arm10tdmi",
1756        .llvm_name = "arm10tdmi",
1757        .features = featureSet(&[_]Feature{
1758            .v5t,
1759        }),
1760    };
1761    pub const arm1136j_s: CpuModel = .{
1762        .name = "arm1136j_s",
1763        .llvm_name = "arm1136j-s",
1764        .features = featureSet(&[_]Feature{
1765            .v6,
1766        }),
1767    };
1768    pub const arm1136jf_s: CpuModel = .{
1769        .name = "arm1136jf_s",
1770        .llvm_name = "arm1136jf-s",
1771        .features = featureSet(&[_]Feature{
1772            .slowfpvmlx,
1773            .v6,
1774            .vfp2,
1775        }),
1776    };
1777    pub const arm1156t2_s: CpuModel = .{
1778        .name = "arm1156t2_s",
1779        .llvm_name = "arm1156t2-s",
1780        .features = featureSet(&[_]Feature{
1781            .v6t2,
1782        }),
1783    };
1784    pub const arm1156t2f_s: CpuModel = .{
1785        .name = "arm1156t2f_s",
1786        .llvm_name = "arm1156t2f-s",
1787        .features = featureSet(&[_]Feature{
1788            .slowfpvmlx,
1789            .v6t2,
1790            .vfp2,
1791        }),
1792    };
1793    pub const arm1176jz_s: CpuModel = .{
1794        .name = "arm1176jz_s",
1795        .llvm_name = "arm1176jz-s",
1796        .features = featureSet(&[_]Feature{
1797            .v6kz,
1798        }),
1799    };
1800    pub const arm1176jzf_s: CpuModel = .{
1801        .name = "arm1176jzf_s",
1802        .llvm_name = "arm1176jzf-s",
1803        .features = featureSet(&[_]Feature{
1804            .slowfpvmlx,
1805            .v6kz,
1806            .vfp2,
1807        }),
1808    };
1809    pub const arm710t: CpuModel = .{
1810        .name = "arm710t",
1811        .llvm_name = "arm710t",
1812        .features = featureSet(&[_]Feature{
1813            .v4t,
1814        }),
1815    };
1816    pub const arm720t: CpuModel = .{
1817        .name = "arm720t",
1818        .llvm_name = "arm720t",
1819        .features = featureSet(&[_]Feature{
1820            .v4t,
1821        }),
1822    };
1823    pub const arm7tdmi: CpuModel = .{
1824        .name = "arm7tdmi",
1825        .llvm_name = "arm7tdmi",
1826        .features = featureSet(&[_]Feature{
1827            .v4t,
1828        }),
1829    };
1830    pub const arm7tdmi_s: CpuModel = .{
1831        .name = "arm7tdmi_s",
1832        .llvm_name = "arm7tdmi-s",
1833        .features = featureSet(&[_]Feature{
1834            .v4t,
1835        }),
1836    };
1837    pub const arm8: CpuModel = .{
1838        .name = "arm8",
1839        .llvm_name = "arm8",
1840        .features = featureSet(&[_]Feature{
1841            .v4,
1842        }),
1843    };
1844    pub const arm810: CpuModel = .{
1845        .name = "arm810",
1846        .llvm_name = "arm810",
1847        .features = featureSet(&[_]Feature{
1848            .v4,
1849        }),
1850    };
1851    pub const arm9: CpuModel = .{
1852        .name = "arm9",
1853        .llvm_name = "arm9",
1854        .features = featureSet(&[_]Feature{
1855            .v4t,
1856        }),
1857    };
1858    pub const arm920: CpuModel = .{
1859        .name = "arm920",
1860        .llvm_name = "arm920",
1861        .features = featureSet(&[_]Feature{
1862            .v4t,
1863        }),
1864    };
1865    pub const arm920t: CpuModel = .{
1866        .name = "arm920t",
1867        .llvm_name = "arm920t",
1868        .features = featureSet(&[_]Feature{
1869            .v4t,
1870        }),
1871    };
1872    pub const arm922t: CpuModel = .{
1873        .name = "arm922t",
1874        .llvm_name = "arm922t",
1875        .features = featureSet(&[_]Feature{
1876            .v4t,
1877        }),
1878    };
1879    pub const arm926ej_s: CpuModel = .{
1880        .name = "arm926ej_s",
1881        .llvm_name = "arm926ej-s",
1882        .features = featureSet(&[_]Feature{
1883            .v5te,
1884        }),
1885    };
1886    pub const arm940t: CpuModel = .{
1887        .name = "arm940t",
1888        .llvm_name = "arm940t",
1889        .features = featureSet(&[_]Feature{
1890            .v4t,
1891        }),
1892    };
1893    pub const arm946e_s: CpuModel = .{
1894        .name = "arm946e_s",
1895        .llvm_name = "arm946e-s",
1896        .features = featureSet(&[_]Feature{
1897            .v5te,
1898        }),
1899    };
1900    pub const arm966e_s: CpuModel = .{
1901        .name = "arm966e_s",
1902        .llvm_name = "arm966e-s",
1903        .features = featureSet(&[_]Feature{
1904            .v5te,
1905        }),
1906    };
1907    pub const arm968e_s: CpuModel = .{
1908        .name = "arm968e_s",
1909        .llvm_name = "arm968e-s",
1910        .features = featureSet(&[_]Feature{
1911            .v5te,
1912        }),
1913    };
1914    pub const arm9e: CpuModel = .{
1915        .name = "arm9e",
1916        .llvm_name = "arm9e",
1917        .features = featureSet(&[_]Feature{
1918            .v5te,
1919        }),
1920    };
1921    pub const arm9tdmi: CpuModel = .{
1922        .name = "arm9tdmi",
1923        .llvm_name = "arm9tdmi",
1924        .features = featureSet(&[_]Feature{
1925            .v4t,
1926        }),
1927    };
1928    pub const baseline: CpuModel = .{
1929        .name = "baseline",
1930        .llvm_name = "generic",
1931        .features = featureSet(&[_]Feature{
1932            .v7a,
1933        }),
1934    };
1935    pub const cortex_a12: CpuModel = .{
1936        .name = "cortex_a12",
1937        .llvm_name = "cortex-a12",
1938        .features = featureSet(&[_]Feature{
1939            .avoid_partial_cpsr,
1940            .mp,
1941            .ret_addr_stack,
1942            .trustzone,
1943            .v7a,
1944            .vfp4,
1945            .virtualization,
1946            .vmlx_forwarding,
1947        }),
1948    };
1949    pub const cortex_a15: CpuModel = .{
1950        .name = "cortex_a15",
1951        .llvm_name = "cortex-a15",
1952        .features = featureSet(&[_]Feature{
1953            .avoid_partial_cpsr,
1954            .mp,
1955            .muxed_units,
1956            .ret_addr_stack,
1957            .splat_vfp_neon,
1958            .trustzone,
1959            .v7a,
1960            .vfp4,
1961            .virtualization,
1962            .vldn_align,
1963        }),
1964    };
1965    pub const cortex_a17: CpuModel = .{
1966        .name = "cortex_a17",
1967        .llvm_name = "cortex-a17",
1968        .features = featureSet(&[_]Feature{
1969            .avoid_partial_cpsr,
1970            .mp,
1971            .ret_addr_stack,
1972            .trustzone,
1973            .v7a,
1974            .vfp4,
1975            .virtualization,
1976            .vmlx_forwarding,
1977        }),
1978    };
1979    pub const cortex_a32: CpuModel = .{
1980        .name = "cortex_a32",
1981        .llvm_name = "cortex-a32",
1982        .features = featureSet(&[_]Feature{
1983            .v8a,
1984        }),
1985    };
1986    pub const cortex_a35: CpuModel = .{
1987        .name = "cortex_a35",
1988        .llvm_name = "cortex-a35",
1989        .features = featureSet(&[_]Feature{
1990            .v8a,
1991        }),
1992    };
1993    pub const cortex_a5: CpuModel = .{
1994        .name = "cortex_a5",
1995        .llvm_name = "cortex-a5",
1996        .features = featureSet(&[_]Feature{
1997            .mp,
1998            .ret_addr_stack,
1999            .slow_fp_brcc,
2000            .slowfpvfmx,
2001            .slowfpvmlx,
2002            .trustzone,
2003            .v7a,
2004            .vfp4,
2005            .vmlx_forwarding,
2006        }),
2007    };
2008    pub const cortex_a510: CpuModel = .{
2009        .name = "cortex_a510",
2010        .llvm_name = "cortex-a510",
2011        .features = featureSet(&[_]Feature{
2012            .bf16,
2013            .fp16fml,
2014            .i8mm,
2015            .v9a,
2016        }),
2017    };
2018    pub const cortex_a53: CpuModel = .{
2019        .name = "cortex_a53",
2020        .llvm_name = "cortex-a53",
2021        .features = featureSet(&[_]Feature{
2022            .fpao,
2023            .v8a,
2024        }),
2025    };
2026    pub const cortex_a55: CpuModel = .{
2027        .name = "cortex_a55",
2028        .llvm_name = "cortex-a55",
2029        .features = featureSet(&[_]Feature{
2030            .dotprod,
2031            .v8_2a,
2032        }),
2033    };
2034    pub const cortex_a57: CpuModel = .{
2035        .name = "cortex_a57",
2036        .llvm_name = "cortex-a57",
2037        .features = featureSet(&[_]Feature{
2038            .avoid_partial_cpsr,
2039            .cheap_predicable_cpsr,
2040            .fix_cortex_a57_aes_1742098,
2041            .fpao,
2042            .v8a,
2043        }),
2044    };
2045    pub const cortex_a7: CpuModel = .{
2046        .name = "cortex_a7",
2047        .llvm_name = "cortex-a7",
2048        .features = featureSet(&[_]Feature{
2049            .mp,
2050            .ret_addr_stack,
2051            .slow_fp_brcc,
2052            .slowfpvfmx,
2053            .slowfpvmlx,
2054            .trustzone,
2055            .v7a,
2056            .vfp4,
2057            .virtualization,
2058            .vmlx_forwarding,
2059            .vmlx_hazards,
2060        }),
2061    };
2062    pub const cortex_a710: CpuModel = .{
2063        .name = "cortex_a710",
2064        .llvm_name = "cortex-a710",
2065        .features = featureSet(&[_]Feature{
2066            .bf16,
2067            .fp16fml,
2068            .i8mm,
2069            .v9a,
2070        }),
2071    };
2072    pub const cortex_a72: CpuModel = .{
2073        .name = "cortex_a72",
2074        .llvm_name = "cortex-a72",
2075        .features = featureSet(&[_]Feature{
2076            .fix_cortex_a57_aes_1742098,
2077            .v8a,
2078        }),
2079    };
2080    pub const cortex_a73: CpuModel = .{
2081        .name = "cortex_a73",
2082        .llvm_name = "cortex-a73",
2083        .features = featureSet(&[_]Feature{
2084            .v8a,
2085        }),
2086    };
2087    pub const cortex_a75: CpuModel = .{
2088        .name = "cortex_a75",
2089        .llvm_name = "cortex-a75",
2090        .features = featureSet(&[_]Feature{
2091            .dotprod,
2092            .v8_2a,
2093        }),
2094    };
2095    pub const cortex_a76: CpuModel = .{
2096        .name = "cortex_a76",
2097        .llvm_name = "cortex-a76",
2098        .features = featureSet(&[_]Feature{
2099            .dotprod,
2100            .fullfp16,
2101            .v8_2a,
2102        }),
2103    };
2104    pub const cortex_a76ae: CpuModel = .{
2105        .name = "cortex_a76ae",
2106        .llvm_name = "cortex-a76ae",
2107        .features = featureSet(&[_]Feature{
2108            .dotprod,
2109            .fullfp16,
2110            .v8_2a,
2111        }),
2112    };
2113    pub const cortex_a77: CpuModel = .{
2114        .name = "cortex_a77",
2115        .llvm_name = "cortex-a77",
2116        .features = featureSet(&[_]Feature{
2117            .dotprod,
2118            .fullfp16,
2119            .v8_2a,
2120        }),
2121    };
2122    pub const cortex_a78: CpuModel = .{
2123        .name = "cortex_a78",
2124        .llvm_name = "cortex-a78",
2125        .features = featureSet(&[_]Feature{
2126            .dotprod,
2127            .fullfp16,
2128            .v8_2a,
2129        }),
2130    };
2131    pub const cortex_a78ae: CpuModel = .{
2132        .name = "cortex_a78ae",
2133        .llvm_name = "cortex-a78ae",
2134        .features = featureSet(&[_]Feature{
2135            .dotprod,
2136            .fullfp16,
2137            .v8_2a,
2138        }),
2139    };
2140    pub const cortex_a78c: CpuModel = .{
2141        .name = "cortex_a78c",
2142        .llvm_name = "cortex-a78c",
2143        .features = featureSet(&[_]Feature{
2144            .dotprod,
2145            .fullfp16,
2146            .v8_2a,
2147        }),
2148    };
2149    pub const cortex_a8: CpuModel = .{
2150        .name = "cortex_a8",
2151        .llvm_name = "cortex-a8",
2152        .features = featureSet(&[_]Feature{
2153            .nonpipelined_vfp,
2154            .ret_addr_stack,
2155            .slow_fp_brcc,
2156            .slowfpvfmx,
2157            .slowfpvmlx,
2158            .trustzone,
2159            .v7a,
2160            .vmlx_forwarding,
2161            .vmlx_hazards,
2162        }),
2163    };
2164    pub const cortex_a9: CpuModel = .{
2165        .name = "cortex_a9",
2166        .llvm_name = "cortex-a9",
2167        .features = featureSet(&[_]Feature{
2168            .avoid_partial_cpsr,
2169            .expand_fp_mlx,
2170            .fp16,
2171            .mp,
2172            .muxed_units,
2173            .neon_fpmovs,
2174            .prefer_vmovsr,
2175            .ret_addr_stack,
2176            .trustzone,
2177            .v7a,
2178            .vldn_align,
2179            .vmlx_forwarding,
2180            .vmlx_hazards,
2181        }),
2182    };
2183    pub const cortex_m0: CpuModel = .{
2184        .name = "cortex_m0",
2185        .llvm_name = "cortex-m0",
2186        .features = featureSet(&[_]Feature{
2187            .no_branch_predictor,
2188            .v6m,
2189        }),
2190    };
2191    pub const cortex_m0plus: CpuModel = .{
2192        .name = "cortex_m0plus",
2193        .llvm_name = "cortex-m0plus",
2194        .features = featureSet(&[_]Feature{
2195            .no_branch_predictor,
2196            .v6m,
2197        }),
2198    };
2199    pub const cortex_m1: CpuModel = .{
2200        .name = "cortex_m1",
2201        .llvm_name = "cortex-m1",
2202        .features = featureSet(&[_]Feature{
2203            .no_branch_predictor,
2204            .v6m,
2205        }),
2206    };
2207    pub const cortex_m23: CpuModel = .{
2208        .name = "cortex_m23",
2209        .llvm_name = "cortex-m23",
2210        .features = featureSet(&[_]Feature{
2211            .no_branch_predictor,
2212            .no_movt,
2213            .v8m,
2214        }),
2215    };
2216    pub const cortex_m3: CpuModel = .{
2217        .name = "cortex_m3",
2218        .llvm_name = "cortex-m3",
2219        .features = featureSet(&[_]Feature{
2220            .loop_align,
2221            .no_branch_predictor,
2222            .use_misched,
2223            .v7m,
2224        }),
2225    };
2226    pub const cortex_m33: CpuModel = .{
2227        .name = "cortex_m33",
2228        .llvm_name = "cortex-m33",
2229        .features = featureSet(&[_]Feature{
2230            .avoid_muls,
2231            .fix_cmse_cve_2021_35465,
2232            .loop_align,
2233            .no_branch_predictor,
2234            .slowfpvfmx,
2235            .slowfpvmlx,
2236            .use_misched,
2237            .v8m_main,
2238        }),
2239    };
2240    pub const cortex_m35p: CpuModel = .{
2241        .name = "cortex_m35p",
2242        .llvm_name = "cortex-m35p",
2243        .features = featureSet(&[_]Feature{
2244            .fix_cmse_cve_2021_35465,
2245            .loop_align,
2246            .no_branch_predictor,
2247            .slowfpvfmx,
2248            .slowfpvmlx,
2249            .use_misched,
2250            .v8m_main,
2251        }),
2252    };
2253    pub const cortex_m4: CpuModel = .{
2254        .name = "cortex_m4",
2255        .llvm_name = "cortex-m4",
2256        .features = featureSet(&[_]Feature{
2257            .loop_align,
2258            .no_branch_predictor,
2259            .slowfpvfmx,
2260            .slowfpvmlx,
2261            .use_misched,
2262            .v7em,
2263        }),
2264    };
2265    pub const cortex_m52: CpuModel = .{
2266        .name = "cortex_m52",
2267        .llvm_name = "cortex-m52",
2268        .features = featureSet(&[_]Feature{
2269            .fp_armv8d16,
2270            .loop_align,
2271            .mve1beat,
2272            .mve_fp,
2273            .no_branch_predictor,
2274            .pacbti,
2275            .slowfpvmlx,
2276            .use_misched,
2277            .v8_1m_main,
2278        }),
2279    };
2280    pub const cortex_m55: CpuModel = .{
2281        .name = "cortex_m55",
2282        .llvm_name = "cortex-m55",
2283        .features = featureSet(&[_]Feature{
2284            .dsp,
2285            .fix_cmse_cve_2021_35465,
2286            .loop_align,
2287            .m55,
2288            .no_branch_predictor,
2289            .slowfpvmlx,
2290            .use_misched,
2291            .v8_1m_main,
2292        }),
2293    };
2294    pub const cortex_m7: CpuModel = .{
2295        .name = "cortex_m7",
2296        .llvm_name = "cortex-m7",
2297        .features = featureSet(&[_]Feature{
2298            .branch_align_64,
2299            .use_mipipeliner,
2300            .use_misched,
2301            .v7em,
2302        }),
2303    };
2304    pub const cortex_m85: CpuModel = .{
2305        .name = "cortex_m85",
2306        .llvm_name = "cortex-m85",
2307        .features = featureSet(&[_]Feature{
2308            .branch_align_64,
2309            .dsp,
2310            .m85,
2311            .use_misched,
2312            .v8_1m_main,
2313        }),
2314    };
2315    pub const cortex_r4: CpuModel = .{
2316        .name = "cortex_r4",
2317        .llvm_name = "cortex-r4",
2318        .features = featureSet(&[_]Feature{
2319            .avoid_partial_cpsr,
2320            .ret_addr_stack,
2321            .v7r,
2322        }),
2323    };
2324    pub const cortex_r4f: CpuModel = .{
2325        .name = "cortex_r4f",
2326        .llvm_name = "cortex-r4f",
2327        .features = featureSet(&[_]Feature{
2328            .avoid_partial_cpsr,
2329            .ret_addr_stack,
2330            .slow_fp_brcc,
2331            .slowfpvfmx,
2332            .slowfpvmlx,
2333            .v7r,
2334            .vfp3d16,
2335        }),
2336    };
2337    pub const cortex_r5: CpuModel = .{
2338        .name = "cortex_r5",
2339        .llvm_name = "cortex-r5",
2340        .features = featureSet(&[_]Feature{
2341            .avoid_partial_cpsr,
2342            .hwdiv_arm,
2343            .ret_addr_stack,
2344            .slow_fp_brcc,
2345            .slowfpvfmx,
2346            .slowfpvmlx,
2347            .v7r,
2348            .vfp3d16,
2349        }),
2350    };
2351    pub const cortex_r52: CpuModel = .{
2352        .name = "cortex_r52",
2353        .llvm_name = "cortex-r52",
2354        .features = featureSet(&[_]Feature{
2355            .fp_armv8,
2356            .fpao,
2357            .neon,
2358            .use_misched,
2359            .v8r,
2360        }),
2361    };
2362    pub const cortex_r52plus: CpuModel = .{
2363        .name = "cortex_r52plus",
2364        .llvm_name = "cortex-r52plus",
2365        .features = featureSet(&[_]Feature{
2366            .fp_armv8,
2367            .fpao,
2368            .neon,
2369            .use_misched,
2370            .v8r,
2371        }),
2372    };
2373    pub const cortex_r7: CpuModel = .{
2374        .name = "cortex_r7",
2375        .llvm_name = "cortex-r7",
2376        .features = featureSet(&[_]Feature{
2377            .avoid_partial_cpsr,
2378            .fp16,
2379            .hwdiv_arm,
2380            .mp,
2381            .ret_addr_stack,
2382            .slow_fp_brcc,
2383            .slowfpvfmx,
2384            .slowfpvmlx,
2385            .v7r,
2386            .vfp3d16,
2387        }),
2388    };
2389    pub const cortex_r8: CpuModel = .{
2390        .name = "cortex_r8",
2391        .llvm_name = "cortex-r8",
2392        .features = featureSet(&[_]Feature{
2393            .avoid_partial_cpsr,
2394            .fp16,
2395            .hwdiv_arm,
2396            .mp,
2397            .ret_addr_stack,
2398            .slow_fp_brcc,
2399            .slowfpvfmx,
2400            .slowfpvmlx,
2401            .v7r,
2402            .vfp3d16,
2403        }),
2404    };
2405    pub const cortex_x1: CpuModel = .{
2406        .name = "cortex_x1",
2407        .llvm_name = "cortex-x1",
2408        .features = featureSet(&[_]Feature{
2409            .dotprod,
2410            .fullfp16,
2411            .v8_2a,
2412        }),
2413    };
2414    pub const cortex_x1c: CpuModel = .{
2415        .name = "cortex_x1c",
2416        .llvm_name = "cortex-x1c",
2417        .features = featureSet(&[_]Feature{
2418            .dotprod,
2419            .fullfp16,
2420            .v8_2a,
2421        }),
2422    };
2423    pub const cyclone: CpuModel = .{
2424        .name = "cyclone",
2425        .llvm_name = "cyclone",
2426        .features = featureSet(&[_]Feature{
2427            .avoid_movs_shop,
2428            .avoid_partial_cpsr,
2429            .disable_postra_scheduler,
2430            .neonfp,
2431            .ret_addr_stack,
2432            .slowfpvfmx,
2433            .slowfpvmlx,
2434            .use_misched,
2435            .v8a,
2436            .zcz,
2437        }),
2438    };
2439    pub const ep9312: CpuModel = .{
2440        .name = "ep9312",
2441        .llvm_name = "ep9312",
2442        .features = featureSet(&[_]Feature{
2443            .v4t,
2444        }),
2445    };
2446    pub const exynos_m1: CpuModel = .{
2447        .name = "exynos_m1",
2448        .llvm_name = null,
2449        .features = featureSet(&[_]Feature{
2450            .expand_fp_mlx,
2451            .fuse_aes,
2452            .fuse_literals,
2453            .prof_unpr,
2454            .ret_addr_stack,
2455            .slow_fp_brcc,
2456            .slow_vdup32,
2457            .slow_vgetlni32,
2458            .slowfpvfmx,
2459            .slowfpvmlx,
2460            .splat_vfp_neon,
2461            .v8a,
2462            .wide_stride_vfp,
2463            .zcz,
2464        }),
2465    };
2466    pub const exynos_m2: CpuModel = .{
2467        .name = "exynos_m2",
2468        .llvm_name = null,
2469        .features = featureSet(&[_]Feature{
2470            .expand_fp_mlx,
2471            .fuse_aes,
2472            .fuse_literals,
2473            .prof_unpr,
2474            .ret_addr_stack,
2475            .slow_fp_brcc,
2476            .slow_vdup32,
2477            .slow_vgetlni32,
2478            .slowfpvfmx,
2479            .slowfpvmlx,
2480            .splat_vfp_neon,
2481            .v8a,
2482            .wide_stride_vfp,
2483            .zcz,
2484        }),
2485    };
2486    pub const exynos_m3: CpuModel = .{
2487        .name = "exynos_m3",
2488        .llvm_name = "exynos-m3",
2489        .features = featureSet(&[_]Feature{
2490            .expand_fp_mlx,
2491            .fuse_aes,
2492            .fuse_literals,
2493            .prof_unpr,
2494            .ret_addr_stack,
2495            .slow_fp_brcc,
2496            .slow_vdup32,
2497            .slow_vgetlni32,
2498            .slowfpvfmx,
2499            .slowfpvmlx,
2500            .splat_vfp_neon,
2501            .v8a,
2502            .wide_stride_vfp,
2503            .zcz,
2504        }),
2505    };
2506    pub const exynos_m4: CpuModel = .{
2507        .name = "exynos_m4",
2508        .llvm_name = "exynos-m4",
2509        .features = featureSet(&[_]Feature{
2510            .dotprod,
2511            .expand_fp_mlx,
2512            .fullfp16,
2513            .fuse_aes,
2514            .fuse_literals,
2515            .prof_unpr,
2516            .ret_addr_stack,
2517            .slow_fp_brcc,
2518            .slow_vdup32,
2519            .slow_vgetlni32,
2520            .slowfpvfmx,
2521            .slowfpvmlx,
2522            .splat_vfp_neon,
2523            .v8_2a,
2524            .wide_stride_vfp,
2525            .zcz,
2526        }),
2527    };
2528    pub const exynos_m5: CpuModel = .{
2529        .name = "exynos_m5",
2530        .llvm_name = "exynos-m5",
2531        .features = featureSet(&[_]Feature{
2532            .dotprod,
2533            .expand_fp_mlx,
2534            .fullfp16,
2535            .fuse_aes,
2536            .fuse_literals,
2537            .prof_unpr,
2538            .ret_addr_stack,
2539            .slow_fp_brcc,
2540            .slow_vdup32,
2541            .slow_vgetlni32,
2542            .slowfpvfmx,
2543            .slowfpvmlx,
2544            .splat_vfp_neon,
2545            .v8_2a,
2546            .wide_stride_vfp,
2547            .zcz,
2548        }),
2549    };
2550    pub const generic: CpuModel = .{
2551        .name = "generic",
2552        .llvm_name = "generic",
2553        .features = featureSet(&[_]Feature{}),
2554    };
2555    pub const iwmmxt: CpuModel = .{
2556        .name = "iwmmxt",
2557        .llvm_name = "iwmmxt",
2558        .features = featureSet(&[_]Feature{
2559            .v5te,
2560        }),
2561    };
2562    pub const krait: CpuModel = .{
2563        .name = "krait",
2564        .llvm_name = "krait",
2565        .features = featureSet(&[_]Feature{
2566            .avoid_partial_cpsr,
2567            .hwdiv,
2568            .hwdiv_arm,
2569            .muxed_units,
2570            .ret_addr_stack,
2571            .v7a,
2572            .vfp4,
2573            .vldn_align,
2574            .vmlx_forwarding,
2575        }),
2576    };
2577    pub const kryo: CpuModel = .{
2578        .name = "kryo",
2579        .llvm_name = "kryo",
2580        .features = featureSet(&[_]Feature{
2581            .v8a,
2582        }),
2583    };
2584    pub const mpcore: CpuModel = .{
2585        .name = "mpcore",
2586        .llvm_name = "mpcore",
2587        .features = featureSet(&[_]Feature{
2588            .slowfpvmlx,
2589            .v6k,
2590            .vfp2,
2591        }),
2592    };
2593    pub const mpcorenovfp: CpuModel = .{
2594        .name = "mpcorenovfp",
2595        .llvm_name = "mpcorenovfp",
2596        .features = featureSet(&[_]Feature{
2597            .v6k,
2598        }),
2599    };
2600    pub const neoverse_n1: CpuModel = .{
2601        .name = "neoverse_n1",
2602        .llvm_name = "neoverse-n1",
2603        .features = featureSet(&[_]Feature{
2604            .dotprod,
2605            .v8_2a,
2606        }),
2607    };
2608    pub const neoverse_n2: CpuModel = .{
2609        .name = "neoverse_n2",
2610        .llvm_name = "neoverse-n2",
2611        .features = featureSet(&[_]Feature{
2612            .bf16,
2613            .fp16fml,
2614            .i8mm,
2615            .v9a,
2616        }),
2617    };
2618    pub const neoverse_v1: CpuModel = .{
2619        .name = "neoverse_v1",
2620        .llvm_name = "neoverse-v1",
2621        .features = featureSet(&[_]Feature{
2622            .bf16,
2623            .fullfp16,
2624            .i8mm,
2625            .v8_4a,
2626        }),
2627    };
2628    pub const sc000: CpuModel = .{
2629        .name = "sc000",
2630        .llvm_name = "sc000",
2631        .features = featureSet(&[_]Feature{
2632            .no_branch_predictor,
2633            .v6m,
2634        }),
2635    };
2636    pub const sc300: CpuModel = .{
2637        .name = "sc300",
2638        .llvm_name = "sc300",
2639        .features = featureSet(&[_]Feature{
2640            .no_branch_predictor,
2641            .use_misched,
2642            .v7m,
2643        }),
2644    };
2645    pub const star_mc1: CpuModel = .{
2646        .name = "star_mc1",
2647        .llvm_name = "star-mc1",
2648        .features = featureSet(&[_]Feature{
2649            .avoid_muls,
2650            .dsp,
2651            .fix_cmse_cve_2021_35465,
2652            .fp_armv8d16sp,
2653            .loop_align,
2654            .no_branch_predictor,
2655            .slowfpvfmx,
2656            .slowfpvmlx,
2657            .use_misched,
2658            .v8m_main,
2659        }),
2660    };
2661    pub const strongarm: CpuModel = .{
2662        .name = "strongarm",
2663        .llvm_name = "strongarm",
2664        .features = featureSet(&[_]Feature{
2665            .v4,
2666        }),
2667    };
2668    pub const strongarm110: CpuModel = .{
2669        .name = "strongarm110",
2670        .llvm_name = "strongarm110",
2671        .features = featureSet(&[_]Feature{
2672            .v4,
2673        }),
2674    };
2675    pub const strongarm1100: CpuModel = .{
2676        .name = "strongarm1100",
2677        .llvm_name = "strongarm1100",
2678        .features = featureSet(&[_]Feature{
2679            .v4,
2680        }),
2681    };
2682    pub const strongarm1110: CpuModel = .{
2683        .name = "strongarm1110",
2684        .llvm_name = "strongarm1110",
2685        .features = featureSet(&[_]Feature{
2686            .v4,
2687        }),
2688    };
2689    pub const swift: CpuModel = .{
2690        .name = "swift",
2691        .llvm_name = "swift",
2692        .features = featureSet(&[_]Feature{
2693            .avoid_movs_shop,
2694            .avoid_partial_cpsr,
2695            .disable_postra_scheduler,
2696            .hwdiv,
2697            .hwdiv_arm,
2698            .mp,
2699            .neonfp,
2700            .prefer_ishst,
2701            .prof_unpr,
2702            .ret_addr_stack,
2703            .slow_load_D_subreg,
2704            .slow_odd_reg,
2705            .slow_vdup32,
2706            .slow_vgetlni32,
2707            .slowfpvfmx,
2708            .slowfpvmlx,
2709            .use_misched,
2710            .v7a,
2711            .vfp4,
2712            .vmlx_hazards,
2713            .wide_stride_vfp,
2714        }),
2715    };
2716    pub const xscale: CpuModel = .{
2717        .name = "xscale",
2718        .llvm_name = "xscale",
2719        .features = featureSet(&[_]Feature{
2720            .v5te,
2721        }),
2722    };
2723};