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};