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